Ideally buffers are stored directly in GPU memory (also known as dedicated memory).
This makes the GPU fetch them incredibly fast, so rendering is fast, but it makes editing them a little awkward, since we don't normally have access to the GPU's memory.
Using different hints for the graphics driver might make it decide to put your buffer in other places (most commonly in system RAM), if it thinks it will be more efficient. Drivers might ignore it completely too, and do whatever they feel like. E.g. profile your buffers and switch them to anywhere they want when they see how you use them.
Generally this isn't really an issue.
Buffers aren't directly related to textures, they are just chunks of arbitrary data. You (or Love in this case) tell the GPU how to interpret that data and what to do with it.
GPUs generally like low amounts of big chunks, rather than big amounts of tiny chunks - this is why drawing 10000 sprites one by one is a lot less efficient than drawing one sprite batch with 10000 sprites.
You use texture atlases, or, images that encapsulate a lot of images, because when you draw with a buffer, you draw all of it for performance, and so you can't switch textures in the middle. At the same time, you want to use many different images for your sprites inside the sprite batch, so you must be able to refer to these images using one texture (there are better ways to do this by now, but they are far less backwards compatible).
Generally, if your sprites are static, don't hesitate a moment and go with sprite batches.
If you have single sprites that tend to change a lot (e.g. players, enemies, moving platforms), you should not include them in big chunks of static sprites, like a level's terrain.
As far as further optimizations, I don't think you'll need any.
Do tell me if I should stop explaining things you probably don't care about worse than any Google search can