Maybe one option could be to poll JoinHandle::is_finished regularly, though this doesn't seem really good to me. Another alternative I could think of is to use std::panic::catch_unwind in the most outer block of your thread and report the panic from within the thread.
I think a custom reporting mechanism based on catch_unwind plus some channel would be the best.
There is also a process-global panic hook that you could use to observe all panics everywhere. Note that this is a shared global, so setting it will overwrite any other panic handlers.