BTC sha256 hashes are hex encoded (as sha256 spits out bytes not a string), why is this? Surely using base58 would be more efficient as would use less space (would output a shorter string)
SHA256 hashes are encoded in plain binary in bitcoin protocol and in block storage (32-bytes in little-endian byte order when treated as integers, which makes them effectively "base256"). The textual hex encoding is merely used for displaying and inputting hashes into the software. Hex is a widely used and understood format for representing arrays of bytes. Also, most cryptographic APIs already support parsing of hex strings into big integers and such, but base58 is not really widely used outside of Bitcoin.
There seems like little reason to change the way I/O of hashes is done as it would only add to confusion as to what a string is for. The purpose of Base58Check strings was not merely to shorten them (as Base64 could've been used for this), but also to eliminate some characters which look alike or are incompatible with the URI format because bitcoin addresses are intended for sharing.
Mark H's answer is correct, but I think there is a more fundamental point: addresses are directly intended for human consumption. Transaction hashes (as well as public keys, block hashes, raw scripts, raw transactions, ...) are not. They are sometimes visualized, but this is primarily for debugging purposes. And hexadecimal is a very natural choice for debugging, as it's easy to see which bytes correspond to which characters.