In order to pass IMarkupServices
into worker thread, the interface need to be implemented and available in first place, and it should also be marshalable. You don't seem to have luck with the latter: the interface does not have a reference to a type library, or custom proxy/stub class. Neither it can be provided with automatic proxy/stub pair. Hence, no passing across apartment boundary available for it.
UPD. The whole point here is that if you can pass interface into another thread, the object itself will indicate the underlying marshaling mode (depends on apartment type, on object's IMarshal
implementation availability), whether you can access the object directly from background thread, or this access is going to be serialized into original thread. In latter case marshaling into worker thread might leave UI thread responsive but the whole processing might be slower in total due to increased marshaling expense. In your case you are unable to marshal in first place.
Basically you are only left the option to work with it in original thread. In native domain you could also attempt to violate COM guidelines and pass the raw pointer into background thread and work with it from there. This is not guaranteed to work and is something I would not advise to do, but depending on the object itself it sometimes works out well. In managed code this trick is even less recommended (if possible at all).