Самое близкое, о чем я могу подумать, - это использовать ILogicalThreadAffinitive и сохранить ваш объект в CallContext потока с помощью CallContext.SetData.
Объект, реализующий ILogicalThreadAffinitive, будет проходить через переключатели логического контекста, такие как BeginInvoke и ThreadPool.QueueUserWorkItem. Также обратите внимание, что этот метод более безопасен, чем использование ThreadLocals для случаев, когда вы используете пул потоков, потому что нет никакого способа, которым вы можете "связать" локальное значение потока в потоке и заставить другой поток прийти и случайно его забрать.