By the way: Is there a special reason why a Trimesh can be created outside the GL thread but not a SwitchNode? If a SwitchNode is created in another thread it simply keeps invisible without an error message or exception.
Looking at the code, I can't find any reason why this should be. Did you remember to call updateRenderState()? Could that be the problem?
updateRenderState should be thread safe from a GL point of view, but further inspection would be needed to say it was safe from a data point of view if you, for example, were editting the scenegraph from two different threads. (Personally, I think it is safe there too, and if not, it should be.)