I can only speak for the C implemention in FlatCC.
Here the buffer is constructed via two modules: the builder and the emitter. The builder handles the interface to the user and any stacks necessary to track generating the correct data. The emitter act as a kind of mini-filesystem where data by default is added to a ring buffer. Once the buffer is completed, the data is copied from one or more pages in the buffer into the final contiguous memory buffer allocated or provided by the user.
It is relatively easy to replace the emitter with your own implementation and there is an example in the test directory where is not stored, but debug data printed instead.
You can hook into this system to know where data is placed and simple forward calls to an instance of the default emitter.
This requires some coordination: you need to know when data is emitted so you can correlate data with what the emitter is seeing. For example, adding an integer field will not emit data, but ending a table will. You can also create an emitter that stores data differently so it is no longer really a flatbuffer, but more suitable to your purposes. The idea with emitter was for example to enable compression or data transmission without materializing the buffer until a later stage.
A simpler approach may be to just look at the 'ref' variables returned by the builder. For example, with an end table call, you get a ref to that table. This ref is a negative virtual address relative to the end of the table. (FlatBuffers are constructed back to front for historical reasons). The 'ref' is never actually stored anywhere, but if you need to add a sub table to a table, or provide the root table to the end buffer call, you use the 'ref' as a handle. Now, you can translate this 'ref' into an absolute offset once you know the able size, or you can just keep it as is and compute the location relative to the end.
There is one caveat: FlatCC stores vtables at the very end of the buffer, at a positive virtual address range. This means the 'ref' is in fact relative to somewhere close to the end, but not really the end. The reason is the clustered vtables at the end are more cache efficient. It can be disabled by calling a method on the builder so you don't get this effect. Or, you can get the ref of the root table, then read the offset to the root table as the first 4 bytes in the final FlatBuffer (AFAIR). Then you can take the difference between this offset and the 'ref' for the root. This delta can be applied to all other 'refs' to get the absolute file offset.
FlatCC also generates a common reader header which includes logic for translating and offset to a pointer while traversing the buffer as it is being read. You can intercept this logic by replacing the common header with your own and thereby read on demand, for example to load a table from a database and copy it to a buffer, etc..
It is vastly simpler to use memory mapped files to achieve something similar, but it depends on the use case.
Mikkel