I feel like this would be at least partially solved if the defense rating was decreased each time it 'blocked' an attack, for instance by attack/10, and possibly have a minimum value of defense/10. This would mean that, eventually, the armor rating should decay to the point where obsolete units can do damage - but the more obsolete the unit, the longer it takes to begin really doing any damage. A slightly more complex formula that factors in just how advanced the weapons and armor are would also help, and could even help distinguish between different types of armor (light vs heavy) and weapons (fast vs hard-hitting).
Such a formula might look something like this:
Defense_Reduction = (Attack*Weapon_Type_Modifier*Weapon_Tech_Level)/(5*Armor_Type_Modifier*Armor_Tech_Level)
where Weapon_Type_Modifier depends on what branch of the weapon tree the weapon came from (cutting vs blunt, at minimum, and possibly take into account the type of cutting/blunt weapon) and Weapon_Tech_Level indicates how far up the tree the weapon is (I see this as a '1, 2, 3, ...' type number, but it could easily be something else, or be ignored; and this should not, in my opinion, be the warfare/conquest research level); Armor_Type_Modifier is dependent on whether this is 'heavy' or 'light' armor (could also indicate the relative durability of the armor, but either way for this to really matter there would need to be at least two distinct armor branches; also if multiple types of armor are on the defender, use some kind of weighted average based on how much armor of each type), and Armor_Tech_Level is a multiplier based on how high up the Armor branch the defender's armor is (if multiple tech levels of armor are involved, use a weighted average based on how much of each type of armor is equipped). I chose to use 5 as the basic divisor just because it seems to me to be relatively reasonable. If you wanted a somewhat variable amount of damage done to the armor each time, Attack could be the attack roll and 5 could become the defense roll.
Defense_Rating would thus end up as:
max(Initial_Defense/10 - Armor_Tech_Level (rounded down to nearest whole number with a minimum of 0), Initial_Defense - Defense_Reduction)
where Initial_Defense is the Defense Rating of the unit at the start of the battle, and max() spits out the highest number given to it (ensuring that, eventually, a minimum
I also agree with RenegadePeon that some sort of overuse penalty should apply - whether 'overuse' is defined as uses of _ per battle or per turn. It doesn't really make sense that one soldier/champion is capable of dodging and blocking the attacks of some much larger number of enemies each turn - though I think the block issue would be better taken care of with a stacking defense penalty as the unit blocks more attacks.