In current versions of Bitcoin Core, most transactions are only relayed once and all transaction are only validated once.
New blocks and transactions in Bitcoin are usually advertised to peers by use of
inv (inventory) messages. Blocks are thereby identified with the hash of their header, while transactions are identified by a hash over the complete transaction (also called
txid). The peer that receives the
inv message will respond by requesting the block header, the full block, a compact block, a Merkle block, or the transaction data if they want it.
Transactions are only relayed twice on older implementations of Bitcoin Core that always request the full block when it is announced by a peer for the first time. Newer implementations use Compact Blocks which transfer only the block header, an encoding of the transactions and up to a handful of transactions that the sending node didn't have when it received the block itself. Nodes don't revalidate transactions that they already had in their mempool, as transactions get validated before a node adds them to their the mempool.
via Compact Blocks FAQ
The full list of transactions must be stored in the blockchain to allow new peers to independently validate the entire transaction history of Bitcoin.