If I'm reading correctly, your system is basically saving a set of scripted draw calls, correct? You'd probably be able to save a ton of space by just serializing user input instead of all of the love.draw() information and then test it a few times to make sure the replays come out deterministically. Your game already knows how to do all the drawing instructions on its own, so you're saving a ton of unnecessary data.
As an example, Doom's demo format (
https://doomwiki.org/wiki/Demo) comes out to about 140 bytes per second, or about 8KB a minute. At that format you'd hit about 2 hours of gameplay or so before you even have 1MB of data to work with.
If your game has any kind of random behaviors, you can serialize and store them in a table for later use with love.math.getRandomSeed() :
https://love2d.org/wiki/love.math.getRandomSeed
You might still run into issues like you're seeing right now if your data tables get really humongous, but it might be an easier fix overall to work with less data for your replays rather than chase down a fix for handling the bigger data set. Even when the set size gets too big, you could probably find the crash point and split the table up before it becomes a problem.
I'm running into some similar issues with gigantic meshes for my 3D toolset, and in those cases it seems like it's more of a warning to not use those models since they're too dang big, haha.