2 methods you could use here:
1. Create a stack of waypoint units that you can pull from when you need a new one instead of always creating them (create only when stack is empty). Store information about who owns the wp/where the wp should direct to in some parallel arrays/linked list data structure. When a waypoint is no longer needed, put it back in the stack. You can change ownership and move the unit without messing with the unit in range event.
2. Instead of using the event, put all your waypoint units in a unit group and then periodically loop through them to check for nearby units that should be redirected.