If i had a 3D arrow model pointing upwards (0, 1, 0) and i set this:
D3DXMATRIX world, rot;
D3DXMatrixIdentity(&world);
D3DXMatrixRotationAxis(&rot, &D3DXVECTOR3(1.0f, 0.0f, 0.0f), 0.3f);
world = rot * world;
...
Make a vector pointing (0, 1, 0), i.e. the same direction as your arrow model, and rotate it in the same way. The rotated vector will give you the direction of the arrow model after rotation...
Putting it a different way, choose two vertices on your original arrow model, a vertex on the "bottom" of the arrow and a vertex of the "top" (the pointy end) of the arrow. These two points define a vector, which points in the arrow's direction. Once your model is rotated, find those two same vertices, they define another vector, which still represents the arrow's direction (obviously). The conclusion trivially follows...
“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”
Or, since you already know that your model was pointing along one of the coordinate system axes, you could just read out the second column of the world matrix. (Transformation) matrices aren't magic, they are just four vectors: right, up, forward, position. (depending on your handedness and as what you define your x,y,z axes).
Read the values from your world matrix before applying the rotation, just to be sure you are looking at the correct column. My point is that after setting it to identity, the second column must be (0,1,0,0). I see no reason why applying the same transformation to the same vectors should return different results just because one is transforming the whole matrix and the other a standalone vector.
Though I notice you are transforming orgDir by rot instead of the world matrix. How would that help if your world matrix has already acumulated several rotations? I can't imagine you want to keep track of (and update) a ton of vectors every time you apply a rotation to the world matrix.