You know, you're right. I was being an idiot.
Originally I wanted to have terrain being given different costs depending on the monster type (for example, Ice-based creatures might treat elemental fire as unwalkable), but indeed, there is no need to recalculate terrain costs for every single monster regardless of whither it is needed or not.
For a group of 30 monsters, only recalculating pathing info once at the start of the processmonsters() routine (as opposed to recalculating it for every monster) reduces the refresh from ~100 ms back down to under 1 ms!
I can add in pathing recalculations for specific monsters that need it later. Cheers