blockhashing_blob is the block header and Merkle tree root hash. The block header has a nonce field and it is this a miner updates and then hashes the blockhashing_blob (which contains the header and updated nonce).
blocktemplate_blob is the whole block with transactions (including any requested reserved space). Nobody hashes the
blocktemplate_blob directly, rather, they use this to create a
blockhashing_blob to hash.
The reason both are returned from
getblocktemplate is because a miner / pool / proxy may want to modify the block's reserved space before creating the
blockhashing_blob. This reserved space can only be easily changed before creating the
blockhashing_blob because you need to know it's offset. Conversely, the nonce can be updated in the
blockhashing_blob directly because it's at a fixed location.
Lastly, it is the updated
blocktemplate_blob that's submitted back to the network when a successful hash is found. This has been updated to include the successful nonce and any reserved data. Setting aside other validation, other nodes simply convert the submitted
blocktemplate_blob to a hashing blob, hash then check resulting hash meets the difficulty target. I.e. they do not need to edit anything.