If so, why is it that in externally owned accounts there is no storage and code hash (Smart contract codes) which are only available in contract accounts?
EOA are little different from the contract accounts. EOA are able to sign transactions and owned by private key. While the contract accounts inherintely aren't capable of self-execution.
To your question, sending ether(or any network currency) from one EOA to another EOA doesn't require any code.
For example, if you want to send 1 ETH to your friend, you can directly go to wallets such as metamask and send ETH by signing contracts.
However, EOA aren't capable of storing contracts that is why EOA's code hash is empty string.
And CA's quite opposite. They are capable of storing smart contracts and receive Ether if there is any payable function in the smart contract.
If you are refering to why EOA don't have any smart contracts but capable of sending ETH to accounts, you can think transferring ETH is a built-in function.
And remember, EOA aren't capable of storing tokens such as USDT, BUSD, UNISWAP etc. In fact, they are stored in the ERC20 contract itself and mapped to your account through mapping datatype and showed in wallets after some filtering and all.
mapping(address => uint256) s_balances;
Typical ERC20 address to balance mapping.
Tell me if it helps!