The framemodel is represented incorrectly:
in most aspects a framemodel is exactly like a frame, which means it can has any attribute a frame can have (pos, size, id, class, data-, hidden, scale, rot, halign, valign).
A frameinstance will override these values[1] (or merge them as in the case of classes and data-attributes), so additionally FrameInstance objects should represent this behaviour for consistency. (The data- and class-behaviour is new in MLv3.)
To allow for the feature above I would suggest some sort of mechanism to retrieve a framemodel by its modelid (as you don't require the object instance in a FrameInstance object). Keep in mind that framemodels can be nested so unfortunately something as Manialink::children.filter(instanceof FrameModel) would be insufficient.
On a side-note I would expect the FrameInstance to get a model in the constructor, as it would encourage the more OO approach on this matter rather than optionally setting the model later. I suppose you want to keep the modelId feature for compatibility reasons.
[1] size and alignment affect the frame-clipping and are currently not overridden by frameinstance which I believe to be a bug (https://forum.maniaplanet.com/viewtopic.php?f=559&t=41195&p=283702#p283702)