You're using when-argument so it's only going to occur once unless you set a repeat count. (You don't mention if you have or not) However if you do it will trigger continuously because the condition will be true every time the SEXP is evaluated unless you repair the ship that is triggering it.
What you need to do is change it slighty to this
$Formula: ( when-argument
( any-of
"Cap 1"
"Cap 2"
"Cap 3"
"Cap 4"
"Cap 5"
)
( < ( hits-left "<argument>" ) 50 )
( send-random-message
"<argument>"
"Normal"
"bhx damage a"
"bhx damage b"
)
(invalidate-argument
"<argument>"
)
)
+Name: damage
+Repeat Count: 1
+Interval: 1
+Team: 0
And add a repeat count. Once you've done that it should work the way you want.
If you check the
FRED Cookbook I actually have a very similar example listed. Unfortunately solution 3 won't work properly due to a bug in the random-of SEXP. I intend to fix that soon though

Won't be of much use to you until you have more variables to play with though.
EDIT : I've just realised that I've never used when-argument within another Every-Time-Argument. If it works you could probably do the third solution on that page and not only have a message played for every ship but have a
different message played for every ship. Certainly something worth trying to see if it works, no?