So, when message queue is involved, instead of one wineserver request we now have two. This doesn't look ideal?
Correct. Avoiding this is hard in general, and it's never come up as enough of a bottleneck to need changing.
Note that if it's the only object we're waiting on (which is many cases, e.g. GetMessage, WaitMessage) then we can delegate to the server, i.e. "ntdll: Use server_wait_for_object() when waiting on only the queue object."