Short answer: you can't; the only way you can do this is to perform your wait asynchronously.
Longer answer:
Conceptually, if a thread could force exceptions to be thrown as an interrupt in other threads, they could do this at any time; not just during your wait or join or io.
It is not always safe to throw an exception - for example in a destructor - since if the stack is already being unwound because of an exception, trying to throw another exception will result in trying to handle 2 exceptions at once - which causes problems.  This is true in Java so shouldn't be an unfamiliar concept.
Java and C# are not C++; their thread object does not represent by requirement a native thread; as such everything they do is likely already asynchronous under the hood to prevent thread starvation in the cases where the number of threads allowed is less than the number of thread objects.
This difference is very notable in the thread::abort style methods; which are fine in C# and Java, but very dangerous in C++ since it terminates the thread immediately in C++ whatever it is doing, including being in the middle of new() which may be locking a mutex - causing all further calls to new() in your application to deadlock.