I know that it verifies the block hash by calculating each hash of the contiguous blocks in order
This alone just verifies that the chain is unbroken. The node will also hash the block header to verify the that hash meets the difficulty requirements for that block height. It also builds the transaction merkle tree, and verifies that the merkle root in the header matches the merkle root of the transaction data.
does it verify the balance of each wallet sending the transactions as well
A wallet is a collection of addresses. As far as the blockchain is concerned, there is no such thing as a wallet, all addresses are treated individually.
A transaction consumes one or more outputs that were previously created to certain addresses. Each address can be associate with multiple outputs. When spending coins, a transaction must reference specific outputs in the past (identified by a transaction ID + output index). The node will then verify that these outputs have not previously been spent by another transaction. It will also verified that the provided scriptSig in the transaction satisfies the requirements for spending an output (usually a signature by a specific private key).
And does it do the block hash calculation every time, or does it just do it when it starts up?
Block verification is only performed as new blocks are received. If you shutdown a node and start it again, it will only run a complete validation for new blocks.