Hi and welcome to the forums!
Like most things, it depends; for a small game with not too many assets, i'd wager that
it's fine just loading in everything at once at the start. For larger games, it probably would be smarter to load things in smaller batches, like per-level/per-world/whatever.
A bit more intermediate solution would be to use a coroutine to signal progress after each separate asset loaded, at least that way, one could include some graphical feedback that "hey! the game's not frozen, it's indeed loading stuff!
", although still with the occasional hiccup while the files are actually being loaded.
Even more advanced, since loading data from harddisks or even an ssd is relatively slow compared to memory access, and the fact that the main thread is blocked while doing that, for really large games/assets that take even longer, people did make solutions to load in files on a separate thread so that the main one wouldn't be blocked at all.
(This may also fail certifications on some consoles, but that's usually not relevant for a Löve game...) And this kind of solution does exist for löve as well, but usually,
most people don't have games where this would be necessary.
As for collectgarbage, that only shows an approximation of how much memory the lua side of things take up; Löve doesn't really have a function to tell you the C++ side of things, those being all *Data and Object types. Do take note that most images that aren't specific types that can remain compressed in your video card will be turned into more raw representations (rgba quadruplets; including jpg and png), the same with audio (except wav, that's already raw-ish data in most cases), that will take up more memory, so just calculating based on the file sizes won't be realistic either.
Then again, i wouldn't worry too much; do take care to heed the warnings on the wiki though, about not using any constructor (love.whatever.newWhatever) in love.update or love.draw each frame, that can tank both performance, but more importantly, waste memory.