Actually, it is not the full storage, but only the non-big_map part. Normally, that part should not grow too much, compared to the big_map part.
But indeed, it can still be expensive to repeat that storage in all transaction results, especially partial ones. In the node, transaction_results are stored in the blocks, themselves stored in the
store database. With a rolling node, i.e. a node that does not keep all the blocks, this storage will be recovered when the blocks will be forgotten. Putting the storage in the transaction results also increases the bandwidth of the nodes, since it makes the blocks bigger, so longer to transmit.
I think the idea was that it was a small cost to pay compared to the benefit for the developers of Dapps to be able to easily monitor the storage of their smart contracts.