Please, just ignore this, I'll send an updated version.
I think the two cases where GetKeyState is reportedly failing, are actually because the created window steals foreground from the main thread even if the main thread calls SetForegroundWindow/SetFocus right after.
Adding SetForegroundWindow/SetFocus call in the "background" thread to restore focus to the main thread as it's supposed to be, makes GetKeyState calls from this background thread catch the key presses even if that thread doesn't peek its messages.
My understanding is then that GetKeyState returns some global (process-wide?) state, that gets updated by whichever thread is foreground as long as this thread peeks its messages, and regardless of what the other threads are doing.
I'm also not entirely sure that keybd_event behaves exactly as if a user is pressing the keys, but there's some obvious issues with Wine implementation nonetheless.