Question: "Is it possible that main thread dequeue blocks from queues (serial or concurrent) OTHER THAN main queue?"
Answer: "No."
If GCD allowed blocks submitted to the global concurrent queues to run on the main thread then those blocks might also execute long-running operations which blocked the UI, and that would be both bad and counter to GCD's own design principles. It's also not how it is documented to work (and the source code is always a good reference if you want to know exactly how GCD works, since GCD is also open source). The only time that a block is likely to be executed on the current thread as an optimization is in the dispatch_sync() case since it's clear that the programmer does not intend to return to the current thread until that block, and any enqueued blocks before it, are done in any case and blocking the current thread is the expected behavior, so there is no surprise there. The same is clearly not true for dispatch_async() since asynchronous behavior is clearly desired with that API.
Finally, just to clear up one other point of confusion in that answer, dispatch_queue_create() does not only create serial queues - it can also be used to create concurrent queues, so concurrent queue execution is not the sole providence of global concurrent queues! See the 2nd argument - it can be set to DISPATCH_QUEUE_CONCURRENT
to create a concurrent queue (the man page is a bit outdated, but the HeaderDoc in /usr/include/dispatch/queue.h
is authoritative).