While I'm pretty certain this is because the game is running out of space in those banks, or it's maybe overflowing into other sections of the game's storage? I'm still fairly new to pokecrystal romhacking and I'm unsure of the best way to deal with this problem without potentially creating an even larger problem in the process.

You should probably just look for empty space for your new maps and scripts. If you don't, you will need to push everything that overflows to a new ROM bank anyway. You can find empty space by compiling pokecrystal without your changes and looking in the resulting pokecrystal11.map file. It will say stuff like:

One advantage of assembly is that the assembler can do this work for you. The pokecrystal.link linkerscript explicitly places different SECTIONs so it can accurately reproduce a Crystal ROM, but you can just make a new ROMX SECTION without mentioning it in the linkerscript. Then the assembler will place the section anywhere it will fit. (Which does mean the section has to fit within one ROM bank, 16384 bytes, at most.)

One advantage of assembly is that the assembler can do this work for you. The pokecrystal.link linkerscript explicitly places different SECTIONs so it can accurately reproduce a Crystal ROM, but you can just make a new ROMX SECTION without mentioning it in the linkerscript. Then the assembler will place the section anywhere it will fit. (Which does mean the section has to fit within one ROM bank, 16384 bytes, at most.)

So for example, Rom Banks 121 and 122 are empty, so I can use the .link file to tell the game to place extra tileset data in those two empty banks?

One advantage of assembly is that the assembler can do this work for you. The pokecrystal.link linkerscript explicitly places different SECTIONs so it can accurately reproduce a Crystal ROM, but you can just make a new ROMX SECTION without mentioning it in the linkerscript. Then the assembler will place the section anywhere it will fit. (Which does mean the section has to fit within one ROM bank, 16384 bytes, at most.)

So for example, Rom Banks 121 and 122 are empty, so I can use the .link file to tell the game to place extra tileset data in those two empty banks?

Sure, but: "just make a new ROMX SECTION without mentioning it in the linkerscript. Then the assembler will place the section anywhere it will fit."

One advantage of assembly is that the assembler can do this work for you. The pokecrystal.link linkerscript explicitly places different SECTIONs so it can accurately reproduce a Crystal ROM, but you can just make a new ROMX SECTION without mentioning it in the linkerscript. Then the assembler will place the section anywhere it will fit. (Which does mean the section has to fit within one ROM bank, 16384 bytes, at most.)

So for example, Rom Banks 121 and 122 are empty, so I can use the .link file to tell the game to place extra tileset data in those two empty banks?

Sure, but: "just make a new ROMX SECTION without mentioning it in the linkerscript. Then the assembler will place the section anywhere it will fit."