When a node receives a transaction, what steps does it do to verify that transaction? I know that it verifies the block hash by calculating each hash of the contiguous blocks in order, but does it verify the balance of each wallet sending the transactions as well? And does it do the block hash calculation every time, or does it just do it when it starts up?
When a node receives a transaction, they perform the following steps at a high level.

Inductively, they already have a set of validated transactions; these belong to the blockchain they have adopted as well as their current mempool. From this, the node has extracted a UTXO.


Ensure that the inputs of the new transaction reference valid outpoints in the UTXO. This ensures that the money being spent is real.
Verify the Law of Conservation, i.e., that the sum of value of the outputs does not exceed the sum of the value of the inputs. This ensures that no new money is being created. The one exception to this is when a new coinbase transaction is received with a newly mined block; in that case, new money can really be created.
For each input of the new transaction, ensure that running the scriptPubKey script attached to the outpoint it connects to with the parameters specified in the scriptSig of the input, leaves the Bitcoin Script stack with a non-zero value at the top. Most of the time, this is the step where the digital signature validation happens and ensures the money is being spent by its rightful owner.


The last step above has many subcases and can function in various ways depending on whether the transaction involves a segregated witness or an attached indirect script, for example.

Lastly, once a transaction is validated by the above steps, the UTXO of the node is updated so that they can validate further transactions.

None of the above has anything to do with block validation. Block validation is a separate mechanism from transaction validation. Transactions are validated even when they don't belong to blocks. One of the block validation steps is to validate all block transactions with the above algorithm. Transaction validation does not require calculating any block hashes.