First, I'll say I've never used this cloak spell technique to affect NPCs, but here's what I know about it.
Spells and their conditions perform their calculations every second. If you know that checking less frequently would achieve the same results then it's optimal if you can find a way to do that. Conditions are checked in the order they are listed so if you put conditions that are most likely to be false first you can sometimes optimize that way. Things like checking to see if the player has a weapon drawn or a specific item equipped are good examples, but remember that any extra checks you make will have to run every second so you don't want to add too many conditions for the cases when they all are true and the effect really should apply.
If you can afford to only apply the affect every 5 seconds or more then the cleanest alternative is to replace the cloaking spell with a quest and a set of aliases. You can use conditions an the quest's ReferenceAliases to select which nearby NPCs need to have the effect added instead of using the ApplyingSpell's conditions. You can simply add a script to the quest itself which goes through and assigns an ability to the NPCs in each of the filled aliases then waits for some amount of time and restarts the quest. (You can also attach a script to each alias that applies the ability to the character when the alias is filled if you prefer.) The quest and its aliases take over the role of the CloakAbility and ApplyingSpell from that example. You still need your MonitorAbility. If your particular case is one that only needs to be triggered periodically (like at the start of combat or when changing locations) you could potentially have the quest started and stopped by the Story Manager.
Scripts can persist after the object or effect they were attached to is gone. If the script is busy running a function or is registered for an event when the active magic effect ends then the script can become orphaned. The OnDying() event gives your script a chance to realize that the NPC no longer needs to be monitored, OnDeath() would be too late. The general principle here is to avoid having the script registered for events or continuing to run functions when there's no possibility that something useful can happen. Generally effects are supposed to clean up registrations automatically but if you were in the middle of an update event when the effect ends you could potentially re-register an event even though there's no reason. By switching your script to a different state you can ensure that even if you did reregister you won't make that mistake a second time.
The worst problems with RegisterForUpdate are certainly those that involve setting the update frequency too low. If you ever get in a situation where the update event is happening faster than the code in the event can finish running you'll break the game. As long as your code in the OnUpdate event is sure to complete well before the next event fires there won't be a performance problem.
RegisterForUpdate basically works like this:
Event OnUpdate()
RegisterForSingleUpdate(1.0)
; Do stuff here but the one second countdown has already begun.
EndEvent
The better way to write your code is to explicitly use RegisterForSingleUpdate at the end of your update event like this:
Event OnUpdate()
; Do stuff here and take as long as you need
RegisterForSingleUpdate(1.0) ; after a pause of one second we'll do stuff again.
EndEvent
The first version will call OnUpdate every second regardless of how long the code inside runs. The second will run OnUpdate with a one second delay between each call.
If you do use RegisterForUpdate you want to make absolutely sure you unregister it when it's no longer needed. And if someone were to uninstall your mod (which they absolutely should not do, but some people will anyway) the script would still be registered for the event even though the script is now missing. (SKSE adds a way to clean up those orphaned reservations, but it's always better to avoid having them.) If you use RegisterForSingleUpdate the worst that happens is that the script isn't found and the event fails once.