Thank you for this post.
On PingPong mode, OnWaypointChange(int index) is indeed called twice, as the moving direction changes on the first and last waypoint. While it seems to be the same waypoint, it is actually not - there is a difference in the reverse boolean variable. With reverse = false and index = last waypoint, the object is still facing forwards. With reverse = true and index = first waypoint, the object turned around and is now facing the other direction. OnWaypointChange is called on both events, for you to decide exactly when your event should happen. You would check the reverse variable value for this in your own script (and to avoid your event being called on the "other side"), without modifying SWS scripts.
Regarding your second point: in the case of index = -1, there is a return statement in the method already and currentPoint is not set to that value.