How could penetration between human models be avoided?
No, Blender isn't capable of doing that (yet). I've tried combining armature-based animation with physics-based cloth/rigid body simulation, and the latter always override any manual animation I've made.

I'd try to limit the range of punch based on bounding-box proximity between the two characters, or trigger a knocked-back animation (faster than the punch animation) depending on how far the punch animation is played + bounding-box proximity.