State messages can use "\V" to display variable values, so it's just a matter of changing the value to a string "was burnt to a crisp!" whenever a fire skill is used.
This is kind of at odds with your next suggestion. If you're doing this every time a skill is used, you wouldn't need/want to be doing troop events that check the last skill ID.
MZ has "last used data" that could make this easier. If last skill Id is "fire" "fire2" "Nova Flare" blah blah...set the killed message variable to "burnt to a crisp!"
...else, set to the default message "has fallen!"
That...could work. You'd need to set up several troop events for every troop in your game (I don't know if someone has written a "common troop event" plugin for MZ to make this easier) that set all the enemies immortal, then check for any of them to die, do conditionals to see what the last skill ID was, and set the variable string that the Knockout state uses before removing the immortal.
The trick is that if you have any reasonable number of skills in your game, it can get to be extremely unwieldy. If you're going the first route (for example, making every skill set that variable to a string in the damage formula), that's obviously tedious to add to every skill in the game.
If you're going the second route, using the troop event, then you'll have this huge, unwieldy event filled with potentially hundreds of conditionals to check the last skill ID and set the string in the event. (I think the damage formula is the less obnoxious of the two)
In order to get around that, you'd start using at least some script calls, and then it becomes one of those things that becomes way simpler to implement via plugin (write one function with a switch statement that displays the appropriate message if your skill has the <FireDeath> notetag, for example).
But you could do it in-engine.