The mention of "battles" and "war" sparked an idea. They really should be split up. Even an outnumbered defender can win a battle or gain local numerical superiority through superior mobility or strategy.
Instead of each side just blasting the other, all offensives are done in "battles". There may be 1 or more battles each ground combat tick with larger forces likely to have more battles but with diminishing returns. It would basically work as follows:
* All units on both sides start in the Reserve. Units move from Reserve to Battle and back to Reserve once the battle concludes.
* All offensive (in reserve, good health and in the front line) units are put in a randomized list. That is a single list including units from BOTH sides.
* Looping through the list from the top, a check is performed to see if each unit attempts to start a battle. This check is a, say, 20% chance modified by commander stats (perhaps something called "aggression"?) and the number of ongoing battles. If the check is passed, a potential battle is created for this unit.
* The unit picks a target using the current rules.
* Both sides now randomly assign reinforcements from the list of all Reserve units. Every unit has a chance to be assigned to this battle related to how many reinforcements have already been assigned by this side on this battle line (front line or support line). This is all the units that could potentially be involved in this battle.
* Once all forces have been assigned, the attacking commander makes a final Balance-Of-Forces comparison on the relative strengths of the two sides of the battle. If it is sufficiently in his favour (again, perhaps modified by aggression or something) he pulls the trigger and the battle commences. If he feels the odds are against him, the attack is cancelled and all units are returned to the Reserve.
* When battle is joined, it works exactly like combat works at the moment, except that no other units except those in the battle can be targetted.
* At the end of a ground combat tick, the battle usually ends, but if the attackers are doing well (again the attacker makes the Balance-Of-Forces check) it has a chance to continue in the next tick. Badly damaged units have a chance to withdraw from the battle, then the reinforcement step happens again as each side brings new units into the battle.
If one side has such a numerical superiority that it starts running out of targets, then too bad. Those units, while wanting to fight, simply don't have the space to do so. So whether you outnumber your opponent 100x or 10000x has much less of an impact. Army size has a much greater impact on how LONG you can keep fighting and what casualties you can sustain, rather than on how strong you are in a single engagement. You cant instagib a Chaos God by just chucking 42 trillion guardsmen at it. It would take a while to chew through them all, but eventually it (likely) would.
It also offers some protection for support units. Even if they get targeted the first time, frontline units have a chance to rush in and defend it via the reinforcement mechanic.
This also enables further mechanics like allowing individual battles to have different terrain modifiers depending on what terrain is available on the planet and even allow fighting over objectives down the line.