Is there any reason you can't require O have a static lifetime? i.e.O: 'static + OtherService + Send + Sync.
If not, then the only way to spawn a thread with a limited lifetime is using std::thread::scope (or similar constructs from crates like crossbeam)... but given that you seem to be storing the join handle somewhere, I don't know if that would even work in your case.
To add to the previous reply, thread::scope doesn't require 'static because all the threads spawned from within are joined (destroyed) by the time it returns. If you want them to run detached (indefinitely long), you need the 'static bound.
This is a red herring. Even if you could do this, it wouldn't solve your problem, it would just move the type error elsewhere.
Lifetime annotations describe, they don't affect how long values live. You can't make a local variable live for the static lifetime by forcibly annotating borrows of it as &'static.
The only way to make a value live longer is to move its owner to a broader scope.