I would say one great benefit is the schema. With JSON the code quickly gets complicated when checking for valid fields and encoding types. As for JSON, when done right, it can be done really fast (but still slower than FlatBuffers) if one cares to optimize for it, and it compresses better than flatbuffers. But as it turns out, flatbuffers is a great way to represent parsed JSON, and also to verify fields.
I can't say I have done it with FlatBuffers, but I have worked a lot with memory mapped formats and disk formats. First, yes, FlatBuffers is well suited because the disk format is stable and portable, and because it is zero-copy, at least for some languages. For other languages, in memory object construction may reduce benefits and increase memory consumption even if loaded from disk. Some of this might be optimized in future versions.
Assuming we have language like C or C++ with zero-copy, and with a more specific use case, then it doesn't really matter much if you
1) memory map
2) just allocate the memory in main memory
3) read the buffers directly from disk io.
The reason is 1 and 2 are the same is that main memory allocation is memory mapped already by the OS. But you can have more control doing it manually, and of course you can persist data between processes.
3) is less obvious, but is at least equally fast and provides much more control, but is also much more work. Here you can carefully control what you load into memory, flush unused memory etc. Memory mapped files still have to call the read function behind the scenes, and you have expensive page misses before that happens. If you don't get it right, you end up with the memory buffers spilling into virtual memory and have double file I/O which you want to avoid. So you end up with something like a LRU cache.
FlatBuffers does have one major downside wrt. memory mapped files: It writes back to front so the builder needs a fully constructed buffer before it makes sense to write it to disk for the purpose of read back, i.e. you cannot trivially stream to disk without rearranging the storage subsequently. But if you keep each buffer reasonably sized, this is also ok.
Compared to JSON or msgpack, or protobuf, these all need to be expanded in memory making memory mapped files less ideal. Direct file I/O can work, because you can load and expand data in you own buffer system. Since JSON compresses better than FlatBuffers for large buffers, you can theoretically gain performance over FlatBuffers due to I/O bottlenecks. But the amount of work to make this work in a general way, is very significant.
So I would say, if you are concerned about memory, don't even memory map, just be clever about you memory access patterns so you keep data in fast cache as much as possible. Otherwise memory mapped files are simpler to work with than raw files, but raw files are more portable.