Well, for standard windows input messages you also have to poll the message pump
But of course, there's also XInput... which, ironically requires you to poll...
As for GetAsyncKeyState being unreliable -- yes, it will miss fast double-(or more)-taps -- but IIRC it actually is stateful such that it won't ever miss a momentary keypress. When a key is pressed, a flag is set internally to true, which isn't cleared until after the next time GetAsyncKeyState is called, meaning quick taps can't be lost.
It's still a terrible plan though for being partially unreliable - the message pump doesn't miss double-taps
I'm pretty sure xinput does the same thing, so that very short/momentary presses can't get lost in between two polls.