Extensible vocabulary

If by internal you mean unstable, then it's OK to leave it like that.
You're right regarding the implementation detail, but I don't see any other way around without using inheritance (which I won't prefer due to its verbosity). At the same time the client code is still simple enough. Anything that I've thought is more complicated and more unsatisfactory than this.

Passing the .fbs file sounds like science fiction in C++. In the client code you need to have the de/serialization code at runtime, unless you want to provide dynamic typing on top of Event and defeat one of the reasons for using FlatBuffers in the first place.