SynchronizationContext can be used to execute work in any other thread's context.
There is a main caveat here though: the other thread needs to be prepared for that, e. g. by using a message pump, like the UI threads in WinForm and WPF do. Also, those UI threads always have a SynchronizationContext, while other thread types typically don't.
As for locking as an alternative, that would need a completely different design inside Microsoft classes. It might be possible, though it might also result in threads blocking for a long time when waiting. I think it would open a lot of possibilities for misuse.
This article on codeproject is rather helpful, like https://stackoverflow.com/a/4107653/586754.