Well really what you are wanting to know is the speed of the controller.
So, I’d forget about the dot product (where is the ‘starting point’ for the punch anyway?), and just look at the per-tick vector magnitude, time scale it to turn it into a speed, and then calculate the short-term average of those speeds every tick.
Then compare the resulting average speed with a threshold to decide between punching or not punching.
Something you might want to use the dot-product for though would be to detect the difference between a glancing blow and a straight on one.
When calculating the average speed above, also calculate the short-term average direction vector of the motion.
Upon impact, also calculate the vector from the impact point to the centre of the object.
Normalise both of them, then calculate their dot product, and the result is what fraction of the hit was aimed toward the centre of the object.
If you do all of this using only X and Y, then you’ll get the component aimed towards the Z-axis of the object, rather than the exact centre, which might well be more useful if the basic shape of your targets are capsules rather than spheres.
After a hit is detected, I’d disable hit detection for a short period or short distance, otherwise double hits could easily happen as the controller passes through the mesh then almost immediately hits it again.
Hope that is of some help. I can’t provide any Unreal specific suggestions, because I’ve only just started using it.