Interesting problem! Here are my solutions:
Making fights long: If you make fights long(er) with many choices, it won’t be a simple matter of trial and error, as there would be so many permutations that no one would be able to (or want to) try out each and every possible combination. But you’d have to make sure that all the correct choices can be tactically found out. Not a single choice should be based on fluke. This way, you can present your readers difficult choices based on their judgmental skills.
Say your player is fighting an abomination and it attacks him. The player has the option to dodge either left or right. Now, you should’ve already presented the player the knowledge that the left part of the monster has a weak point waiting to be exploited. So the player should dodge left and attack. However, if they choose to dodge right, doesn’t mean they should be punished with death. Which brings me to my next point,
Two consecutive wrong choices before death: Do not just punish the player with death over one wrong choice. This is not dark souls, this is interactive fiction. Make sure the player makes at least two (or better, three) wrong consecutive choices before they are shown the dreaded dead screen.
Continuing the above example, the player still decides to dodge right where the enemy has a large damaging hand on their abdomen (it is an abomination). Now the player has to roll backwards because of their wrong choices, but if they still decide to press forward and attack the strong arm, they are hit by it and are severely damaged or die.
If the player rolls backwards out of harm’s way, they lose the opportunity to exploit the weak spot of the monster but are at least alive and need to find other ways to kill them.
Stat checks: Stat checks are also a great way of implementing good fights. Players should be wary of the option they’re choosing requires some said stat.
If we implement stat checks in the above example, if the player dodges left (towards the monster’s weak part) and decide to attack, the player should have some amount of speed before the attack is successful - and depending upon the strength of the player, damage is dealt. If the player fails the speed check, the monster just blocks the attack.
If the player decides to dodge towards right (wrong way) then the player has the option to roll backwards as the monster attacks with his arm. If the player has enough dodging ability, he successful dodges, otherwise fails to dodge and gets hit. Also, if the player decides to attack, and the monster attacks too, give a very difficult strength check - if successful the player parries the monster’s attack and lives, else he dies.
Please note that even after surviving the monster’s attack, the player has not gained any advantage because of the wrong choice to dodge towards right. After choosing one wrong choice, the successive choices determine if the player will live or die. To make very difficult fights, one wrong choice should result in death.
Preparations: Further, you could add choices to prepare for the fight beforehand (like in the witcher games), which could help in fight one way or the other.
Say in above example, the monster’s weakness is fire, and before the fight, the player got the option to choose between a firebomb or a strong sword. Choosing a strong sword is beneficial to the overall fight(by dealing more damage), but choosing a firebomb could help one win the fight easily. When the player decides to dodge left, he gets the option to throw the firebomb and greatly damage the monster which stuns it or possible kills it.
Preparation could also involve gathering knowledge about the monster the player is going to fight (like knowing the weak point of the monster) or such.
All the above points will require humongous amounts of coding, which I think, you’re prepared for, since you wish to implement difficult fights. It is difficult, but a Choice of Game with great mechanics is certainly possible with great efforts! I wish you good luck and hope you can create the first game in ChoiceScript with such great fights and mechanisms.