OK, I was so far off on my previous answer, that I'm frankly embarrassed. Although I was right in saying that all corpses are civilians, it is a fact that triggers never pick up corpses anyway (Unlike nearestObject type commands, which is what I was thinking about). Sorry! While I was fixing this (by actually building a test mission, rather than answering from the top of my head) I also added JIP handling and managing the civilians potentially being in vehicles.
You need a trigger to count the initial number of civilians on the map, including those that start within vehicles (CIVILIAN PRESENT NON-REPEATEDLY)
Condition: this
OnAct: initialCivs = { count (crew _x) } forEach thisList;
(This is actually similar to your initial system, but using a trigger to count the initial number of civilians).
A trigger to end the mission if 5 civilians have been killed (CIVILIAN PRESENT NON-REPEATEDLY)
Condition: numCivs = 0; { numCivs = numCivs + ({ alive _x } count (crew _x)) } forEach thisList; (initialCivs - numCivs >= 5) and (time > 10)
OnAct: end mission....
(time > 10 allows for start of mission, especially JIP, to have created all the civilians so the mission doesn't think they have died already!)