As far as I understand, Protector is called every second, as well as on player entry and when the owner is updated.
I might be wrong, but I think it would be even better to replace lastDespawnUpdateTime with a boolean value(something like despawnTimeUpdated).
Then, inside UpdateDespawnDateTime(float time, HitInfo info), set it to true.
Also, the HitInfo parameter can be removed from the UpdateDespawnDateTime method.
And in Protector(), before if (DateTime.Now >= despawnDateTime), call the OnRaidableDespawnUpdate hook if despawnTimeUpdated == true, and then set it back to false after the call.