In addition to the predefined primitives, you can leverage abstract objects in your subWorldDraw() and subViewportDraw() implementations. Any object that supports the AcGiDrawable protocol can be used as a sub-object. Since AcDbObject derives from AcGiDrawable, any database object can be used in this way, if it makes sense.
A drawable need not be graphical. For example, a drawable might only set the subentity traits to a particular combination and not implement suWorldDraw() or subViewportDraw() at all.
This architecture allows the developer to distribute rendering code more efficiently. For example, the worldDraw() implementation of AcDbBlockReference simply pushes the insertion transform onto the stack, calls draw() passing in a pointer to its AcDbBlockTableRecord, and pops the matrix stack. The worldDraw() of AcDbBlockTableRecord iterates over the entities in the definition. The benefit of this technique is that the graphics for a given entity need only be generated once, and can be cached on the object and efficiently reused for subsequent references.