If each thread is dedicated to one file, then it might make sense to have each thread create its own MMF for the one file it is working on. Resources that are only used by a single thread are easier to allocate and destroy within the thread.
However, if all the threads are reading from the same file, then you don't want to create multiple MMFs, because all that will do is multiply the amount of memory consumed and create coherency issues (multiple views of the same section of the file).
For multiple threads operating on the same file, you should create the MMF once and share the MMF pointer with the multiple threads.
Allocating on demand in a multithreaded situation gets complicated fast, and usually boils down to requiring a lock around every access to the protected resource. Requiring a lock can quickly defeat any performance advantage of running multiple independent threads, if they all have to line up and wait for access to the shared resource.
If you can allocate the shared resource prior to constructing/starting the threads, then you often don't need to lock around accessing the resource because the resource is always present by the time the threads need it.
So, I'd consider allocating the MMF before the threads spin up and sharing the MMF pointer across all the threads without locks.
This also assumes that the file is strictly read only - that the multiple threads are never going to write back to the file or MMF. Multiple threads can share a pointer to a common memory area / MMF for read only access without any thread concurrency issues.
Be careful of your assumptions about MMF performance compared to traditional buffered file access. If your entire file data fits comfortably in available RAM, then MMF can be more performant for random access patterns than buffered file I/O. If the file data is much larger than available RAM, then buffered file I/O can be more performant for random access than using an MMF. Why? Because MMFs are piggish about memory use. MMFs can only load data in 4k page size chunks. Buffered file I/O can be more finely tuned to your actual data size needs and patterns. If your app loads 512 bytes of data from 100 different widely separated locations in the file, MMF will have to load 4k * 100 = 400k bytes of data even though you only need 512 * 100 = 50k of data. In this data access pattern / use case, MMF requires 10 times more data transfer and memory consumption than traditional file I/O.
The main attraction of MMF is more often developer convenience rather than raw performance. Reading from a pointer backed by MMF is usually more convenient for the developer than writing and tuning a block-oriented file I/O subsystem. There's nothing wrong with using a technique because it's simple and convenient to the developer, as long as you acknowledge that truth.