It gets fragmented when it gets transformed into a Graphic3d_something for rendering.
I don't get what do you mean by "fragmented" here - Graphic3d_ArrayOfPrimitives is just a couple of continuous arrays of vertex attributes and indices - very close to Poly_Triangulation, just packed in single precision. Graphic3d_ArrayOfPrimitives is an auxiliary interface for filling in Graphic3d_Buffer + Graphic3d_IndexBuffer, which are passed to construct Vertex Buffer Objects (VBO) at lower graphics level. You may fill in Graphic3d_Buffer directly if you found per-vertex function overhead considerable in your case.
I extended the Poly_triangulation class to support trasformations bulkly applied to each single vertex, as I am interested in rigid transformations to be efficient (at least those). So I implemented Transform(), Translate() and Rotate() methods, being very careful to transform each vertex in-place.
I have some doubts that transforming vertices is what you really need here, unless your simulation computes deformations of water / soft bodies or something similar. Normally, you would better splitting a mesh into individual transforming pieces. Assigning Local Transformation to AIS object is much less expensive operation than computing per-vertex transformation on your own.
Note that OCCT doesn't yet implement interface for skeletal animation, because it is rarely useful in CAD applications. This mechanism should allow applying per-vertex transformations to the mesh without re-uploading of entire mesh data, as necessary transformations will be done by special GLSL Vertex Shader. If this is what you are trying to implement, then it could be done by improving OCCT or using custom GLSL programs.
Apart from the variance, which is as bad, the bottleneck is in the AIS_triangulation::Compute().
::Compute() usually creates primitive arrays in format, supported by graphics driver. As you already figured out, you may create this array on your own before hand and avoid extra copies of the same data - like AIS_PointCloud::Compute() which just puts myPoints into graphics group. Note, that apart from ::Compute(), there is also ::ComputeSelection() which also takes some time if your object is intended to be selectable, but this is a different topic - I assume that your objects are not selectable here (displayed with -1 selection mode).
What comes next to ::Compute() is uploading of these array into GPU memory - which might take a while for large amounts of data. If your transformations are straightforward, they could be done by implementing a custom GLSL program. If calculations aren't that simple, but mesh is updated partially, then Graphic3d_Buffer::InvalidatedRange() mechanism could be useful to re-upload modified portion of Graphic3d_ArrayOfPrimitives without recomputing entire presentation. Alternatively, you may split large mesh into smaller pieces and recompute only changed parts as individual AIS objects.