ValueTree doesn’t rely on message-thread. It has synchronous callback behaviour (on the same thread where the changes happen), while others like ChangeBroadcaster are asynchronous, and callback on the message-thread.
This is simply a matter of definition and should be taken into account when programming.
I agree, there should be better tools (like wrappers for thread-safe access to / and callbacks from value-trees) and warnings do deal with it.
I’ve pushed some changes to ListenerList, I don’t expect this to fix anything and everything but it would be good to see how much of an issue it still is for others.
Unfortunately I had hoped to add some additional debug assertions to help catch common issues but it seems due to the way some hosts work it results in a too many false positives so I’ve had to leave it out for now.