Sprite Kit has had this problem ever since the beginning, and I haven't seen any explanation of it. My theory (FWIW) is that when the contact is made with a slowly-moving object, so that the position change between frames would be very small, the object (the object's physics body, I mean) gets entangled in the physics simulation's overlap detection/removal. That is, perhaps in part because of rounding errors or iterative approximations in the physics calculation, the object is detected as overlapping, and a small adjustment is applied to "free" it from the overlap. If this happens in successive frames, the object appears to stick or to slowly slide along the edges.
That's pure speculation, of course, and I don't know of a way around it. One possibility that I haven't tried is to adjust the absolute units of your scene. For example, if you create your scene at double the size (and let its overall scaling bring it down to intended apparent size), you could have double the velocities for all moving objects. That might reduce the relative errors, at least in the cases you care about.
As usual, you should submit a bug report in order to "vote" for a solution to the problem. Other than that, if your workaround gives you the behavior you want, then I'd say to stick with it. 🙂