Synchronous vs. asynchronous and concurrent vs. serial are two separate concepts. Synchronous vs. asynchronous is about when the caller can continue. Concurrent vs. serial is about when the dispatched task can run.
The outer queue.sync() call will not return until the closure it is submitting has run to completion. The closure might be run right on that same thread or it might run on some worker thread maintained by GCD.
The inner queue.sync() call, again, will not return until the closure it is submitting has run to completion. However, since the queue is concurrent, there's nothing preventing the inner closure from running just because the outer closure is also running. Concurrent queues allow multiple tasks to run at the same time.
Concurrency is not the same as asynchronicity. Each queue.sync() call still doesn't return until the submitted closure has completed.
If the queue were serial, then, yes, your code would cause a deadlock.