Provided you never multiplied the final result by a projection matrix if this is still a world matrix as it seems.
Then If you multiplyed a world by a scaling matrix and just mulitplied it by some rotations and such (again without a projection matrix in the result).
Then you should be able to simply save the inverted scale when you create the scaling matrix itself e.g. if scale = Vector3(x,y,z); to be set to the scaling matrix.
Then the reciprocal of the scaling vector is found by Vector3 iscale = 1f / scale;
So that per component. i = 1f / s;
Were the original values or identity vector 1,1,1 are found by iscale * scale;
Such that iscale can be set to a scaling matrix.
To illustrate in practice were 2f is a component of the scaling vector s
and i is the recipricol 1/s.
1 = i * s;
.5 = 1f / 2f; // .5 is the reciprocal of 2f;
1 = .5 * 2f; // 1 is the numerator (which is always 1 here for us) then the identity scalar is found by the reciprocol (now used as a coefficient) * the original scalar
So that you should be able to reset the scale of your matrix by simply...
m = m * Matrix.CreateScale(iscale.X, iscale.Y , iscale.Z);
m = m * Matrix.CreateScale( 1f / scale.X, 1f / scale.Y , 1f / scale.Z);
You might need to pull the translation vector then reset it after you do the above as well depending on your order of operations.
Again provided you haven't projected as the projection matrix skews the scaling depending on z in that case you will need to first use matrix.UnProject Though you might be able to rig up your own function that sets m41 thru m43 to descale this wouldn't be straight forward to do it.
CreateWorld and CreateLookAt if i remember right basically set the scale to 1 by normalizing. Which you should also be able to do (though im not sure about this one) on M.Forward.Normalize(), M.Up.Normalize() M.Right.Normalize() to bring the matrix into line with a scaling factor of 1.