What you are talking about is cross-thread access, not thread synchronization as I first thought. Ignore my previous answer.
The reason why the MVVM Light Messenger does not dispatch between threads is by design. I dislike hiding the dispatching within the Messenger object for two reasons:
1) Multithreading is very complex, and I feel that it is easier to find errors when the dispatching is done explicitly.
2) Dispatching within the Messenger would complicate the Messenger's API. It becomes necessary to pass parameters for the priority with which messages need to be dispatched, for instance. I decided not to add this complexity within the Messenger.
Instead, dispatching the message is the responsibility of the caller. I provide the DispatcherHelper class (which is a work in progress, granted, but covers most simple scenarios) to help the user with that.
It is not excluded that this changes in the future, and that the Messenger becomes more thread aware. I am careful however not to include too much complexity inside the Messenger for the reasons stated above.
I hope that it makes sense,
PS: Regarding asynchronous collections: I see some scenarios where they can be useful, but in general I recommend against them. Unit testing an asynchronous collection is very difficult. As a rule, I think that Observable collections (and arrays and dictionaries...)
should belong to the UI thread and be modified on that thread only.