How to monitor a transaction that starts but never completes?

I would use a UVM objection at the rising edge of the signal; and then fork/join_any a parallel thread with a timeout delay that will throw a UVM error at completion. The racing thread being the monitor main thread.

So long as your are doing that check in the monitor; that looks pretty elegant too: but it seems to me you could have a test end while a transaction is still incoming and valid.