While loops only check the condition at the start of the loop, then it executes everything in the action section before ever rechecking the condition. So yes you are correct in thinking the trigger is not being canceled during the wait. There are certainly ways to make triggers ignore specific units/players, but a much more straight forward way to fix your problem is to just move your wait action to the very end of the while loop. That way you are executing all your actions in the same game tick that you are checking your conditions, rather than running actions based on the conditions of the game 3 seconds ago.
The one thing this changes is that originally when your unit entered a region there would be a 3 second delay before the first speed debuff is applied. After making this change the first speed debuff would be applied instantly. If that change is fine with you, then you are good to go. If you wanted to readd the initial delay you could add an extra wait statement before the while loop even starts.