Obviously, QBASIC was designed for a single tasking environment, in which it really didn't matter much if one program used the entire CPU constantly looping polling for keyboard input.
INPUT$(1) might possibly work better in that regard, but, at least in QBASIC, it doesn't handle extended keys (for example: the arrow keys) in the same way as INKEY$.
In my program at:
I repeatedly call ReadConsoleInputW, which does not return until it can return at least one item (key press, key release, mouse event, etc...). It doesn't seem to hog the CPU at all. I'm thinking (I could be wrong) that the function waits (gives up thread execution) until there is input to return.
However, QB64 programs are not console programs, so I am thinking something else would be required.