Wait a second, I think I understand, at least in the GrPs files, the second list, is the offset of some offset, similar to the relocation table, but the name is to whatever struct the offset *should* point to.
So, I'm guessing there is some list of named structs like "GrdPStadiumWater_TopN_joint" that is stored at runtime with absolute memory offsets, and the proper way to read the secondary table is to look up these named structs which should already be loaded into memory, and replace the offset in the data block that is pointed to by the secondary (reference) node with the correct memory address.
EDIT: Also, semi-related to this topic, but more to dat files in general.
Joint structs with flags == 4008, or with the 14th bit set (with 1 == flag 0), have alternate JointData (or tcll's Object) structs.
Similarly, I've found that Joints with flags == 1005088 will end their next list with an unknown struct of pointers. So Joint->next->next->next->etc until next is 0, the last Joint in the next list will have a list of offsets after it. I'm pretty sure it's one of the flags, because some next linked lists don't end in this list, but 10050088 all end in them.
ex: GrBb.dat : (aff28 Joint), 'next' linked list ends at (b0028 Joint) with (b0068 Unknown) having a single offset aff28, our starting Joint.
I'm pretty sure this is my MapDataFtr struct, but I have to look more into it. That's my update for now.