Made some progress tracking down the lookup table. I was able to trace execution through the star level up routine and find where it's pulling data from. The game reads in a block of data from 0x13B6B370 on disc 1 (sector mm,ss,ff == 31,16,71), and stores it in memory at 0x80101448. I don't understand how this data is formatted, it seems obfuscated in a way. But I did verify it's responsible for which slots open up at specific levels. If anyone wants to step through it in a debugger, the instruction execution for using this table starts here (after a battle if a star is earned): 801EF130
The best summary I can make is that the game iterates over this data for the number of current star levels in 16 byte strides and uses the table data with some bit manipulation to determine which slot opens. It then ORs the value onto another table at 0x80071C7C.
This second table is the current state of unlocked slots for all 45 characters in the game. It's stored as a 2 byte pair of grid bitmasks. As the star level increases, this table will eventually match the grid bitmasks defined in the character stat blocks
Once this second table has been updated, the routine finishes by iterating across each 2 byte pair, shifting and masking for each slot, and checks the low bit to see if the slot is unlocked. If that is the case, then the game clears the seventh bit of the character stat block's low byte pair (0x4000 becomes 0x0000), which makes the slot usable.
I still need to dig into that first table to try and understand how it's formatted. But at least now we know where the data lives on disc.