All of the algorithms you've mentioned (HKDF and SHA-256) are pseudorandom. In general, any approach you're going to be using here to expand some truly random numbers into other sequences are also pseudorandom. That's because these algorithms are deterministic: if you put the same data (entropy) in, then you'll get the same results.
True random numbers come from a physical source and are not deterministic. That can be radioactive decay, thermal noise, free-running oscillators, or other types of sources. Because these don't necessarily produce equal numbers of ones and zeros and failure is not unknown, usually there is some sort of filtering and processing, which may be a cryptographic algorithm like AES-CBC-MAC or SHA-256, or some sort of bias elimination or reduction like XORing or Von Neumann debiasing, or both.
If you used a TRNG and produced random bits, you could XOR them with more bits from a TRNG and get the same security, but this would be silly because you're using twice as many bits from a TRNG for no gain in security. Similarly, you could perform modular addition over bytes with two TRNG values, but again this has the same limitation. Bitwise AND biases the output, so it would weaken the security.
Since any algorithm to expand the output of a TRNG is going to be pseudorandom instead of truly random, what you're essentially proposing sounds like a stream cipher with a pre-shared key based on a TRNG. However, that's totally fine as a design! As long as you pick a secure stream cipher, that's a legitimate and secure design. However, stream ciphers are not one-time pads and are not provably secure, but they are vastly more convenient to use in real life.
If you do choose to go this approach, I highly recommend you pick an existing, well-designed library to build this. TLS has support for pre-shared keys, and there are of course other libraries which can do this as well for messages.