Hi,
The code of NoScalar is fairly simple, so it may be useful to read it in order to understand what it does exactly. NoScalar basically looks for Scalar[_] objects and uses ReplaceDummies on them:
(* Thread over Plus and Times *)
NoScalar[expr_Plus] := NoScalar /@ expr;
NoScalar[expr_Times] := NoScalar /@ expr;
(* Remove Scalar head from positive powers *)
NoScalar[Power[expr_, n_Integer?Positive]] := Apply[Times, Table[NoScalar[expr], {n}]];
NoScalar[Scalar[expr_]] := ReplaceDummies[expr];
(* Skip inert heads *)
NoScalar[ih_?InertHeadQ[expr_, z___]] := ih[NoScalar[expr], z];
NoScalar[expr: _?ProductQ[___]] := NoScalar /@ expr;
(* Derivatives *)
NoScalar[der_?FirstDerQ[expr_]] := der[NoScalar[expr]];
(* Do nothing on other cases *)
NoScalar[expr_] := expr;
So we see that NoScalar can only act on bases of positive integer powers. This excludes roots and denominators.
NoScalar should be probably generalized to enter CTensor objects.
Cheers,
Jose.