scriptNode is a good one for non physical objects. You can also use the scriptNode's open and close functions to do initialization.
I also like partition nodes - createNode('partition')
. They show up in the outliner but without having a physical presence in the scene. They have the same attributes as asset containers so you can add a bit of metadata (like user name and time created) without extra work.
For transforms, createNode ('transform')
makes and empty group. You can lock-and-hide all the attribs, but you'll still have them in the attribute editor. Sometimes I use a single locked-and-hidden transform with a display override set to reference as a hierarchy parent for untouchable objects like rigging innards. Asset nodes are transforms but with some extra facilities (like auto-hiding their contents) and make a good stash for other nodes.
You can also store the information into the file without a node by using fileInfo (link in python, but the idea is the same). This is great for static data that doesn't need to be connected to the scene graph. It's more useful in python where you can encode more complex data using standard tools.