A good fight brings evenly matched opponents together in an environment where superior skill will prevail. If one side is obviously going to win, no matter what the other side does, it is not a good fight. If randomness prevails, it is not a good fight.
I would not demand that it be a fair fight. Luring your enemy into a situation where they are going to lose is an element of superior skill. Setting up a good ambush takes skill, as does understanding the meta-game to counter-build. It can also be a component of a good environment that one tactic is favored in A while another is favored in B. It is a bad game environment if ambushes always lead to victory or one class has no chance in A but will always win in B.
I think “evenly matched” is the key component to discuss here, and the two major components are quantity and quality. I would think, however, that is relatively self-explanatory. Sides need not be of equal numbers, but they must be balanced against each other. Given equal numbers on each side, a system designed to give you a good fight will try to balance quality on each side.
That last bit is really hard, and most games do not even try. It can also be really upsetting when you want to play with your friends but are too good to be fairly placed on the same side. You could argue that identifying and working with good teammates is a component of skill, and you should certainly win on that basis, but something is wrong with the game-matching algorithm if you always win on that basis (unless you are literally the best players out there). The League of Legends matchmaking algorithm, for example, assumes that a pre-made group is going to do better than its individual members’ ratings would suggest and looks for harder opponents.
The basic unit of balancing teams is an advanced version of trying to find a balanced one-on-one fight: take the player’s rating and try to find an opponent with a comparable rating. In a team environment, you add those.
Almost every game (that does this) I have seen tries to do so with even numbers, rather than pitting one 200-rating opponent against 4 50-rating opponents. In most games, the baseline effectiveness of a character is such that being Really Good will not let you overcome 4-to-1 odds. There are, however, games that work on exactly the principle of having one 200-point monster fighting 20 10-point enemies, like Ogre. I fondly remember Dino Wars!, a miniatures game in which one side uses dinosaur toys and the other uses little green army men. If the point buys are balanced, you can mix quantity and quality pretty freely in such a system.
Looking back at Guild Wars 2, a good fight will also mix quantity and quality. A really good group of 20 could be a good fight for a mob of 40. Zergs bashing into each other will often be good fights, decided by a few key decisions that most of the zerg scarcely notices.
As quantity increases, the importance of quality decreases. Even if you are all four times as good as average, it is really hard to be the 20 in an 80-on-20 fight. Massed attacks will down you, no matter how good you are. In our GW2 example, the ability to revive each other makes it very hard to chip away at the 80. Games begin to lag with that many players, so the availability of skill decreases; in GW2, skill lag makes the merit of a zerg that everyone can auto-attack at once.
Population imbalances of the type I have been complaining about make it harder to get good fights just because of those quantity differences. They are still possible, but as quantity increases towards the cap, the only possible response becomes increased quantity on your side as well. When that is not an option, superior numbers guided by even minimal intelligence can roll over opposition. At best, a skilled group can devise a battlefield it can hold against much larger numbers, which is a sort of win condition in that the enemy will either seek easier prey or take it out with massed trebuchets. The game only rewards your meat grinder if people keep throwing themselves into it.
We might also see good fights in alternate win conditions. The story of 300 involves exactly that outmanned force that is certain to be destroyed. Their win condition was not defeating the entire Persion army. It was holding the pass long enough for the larger situation to change. Also: kill lots of Persians. Some games give you that alternate win scenario like surviving for 30 minutes or waves, even if eventual defeat is inevitable. That can be good. You can also define your own victory conditions, which range from heroism to straight up trolling.
When you define your own win conditions, you had best have intrinsic motivation, because more or less by definition the game is not going to reward that. Ultimately, that is what MMOs were really about from the start: approaching a virtual world on your own terms. But as I have said about the “bring your own friends if you want to have fun” approach to content and group-finding tools: if you are doing the heavy lifting yourself, the game is not, and you might as well play something (anything) else.