With me moving the Trainer AI elsewhere, I was able to optimise the party stuff a little bit. There's a lot more space and from what I can tell it works fine.
There are now three separate files - one for standard trainers, one for the rival & oak, and one for scaled parties (aka gym battles and related). This is mainly for organisational purposes.
If I run out of space again, I'll rework the Trainer AI script to pull parties another way, storing the party files in individual banks.