To implement this business rule in this table structure with a unique key constraint, you're going to have to do something slightly unnatural.
You could add a column called CancellationCode. Make it an INT. Reserve the value 0 in that column to mean active / expired, and make that the default value. Then, if you cancel a reservation, assign a unique nonzero value to the CancellationCode in that row. You could use your ReservationID value in the row for that, or you could have a Cancellation table with its own unique id.
You can keep your ReservationStatus column so you can tell what's going on with a reservation. But when you look up active / expired reservations, use WHERE CancellationCode = 0
, just in case CancellationCode and ReservationStatus get out of sync.
Then make yourself a unique index on (SubItemId, Date, TimeOfDay, CancellationNumber). This will foil any attempts to insert new active reservation rows for the same combinations of SubItemId, Date, TimeOfDay values as existing rows.