It sounds like you learned a lot today!
Here is how I would do it (I haven't thoroughly tested this, so it
probably has some bugs):
Define a tensor (which really ought to be private, this is the only
thing to use it for) which can take any indices and has no symmetries:
DefTensor[AnyT[AnyIndices@TangentMani], Mani]
SymmetryGroupOfTensor[AnyT[inds___]] ^:= StrongGenSet[{}, GenSet[]]
Then, make you VarDer look more like VarD, allowing it to take a
derivative (PD is the default):
VarDer[S_[inds___], der_: PD][expr_] :=
Module[{frees = IndicesOf[Free][expr], oinds, varn},
oinds = ChangeIndex /@ frees;
varn = VarD[S[inds], der][expr AnyT @@ oinds];
IndexCoefficient[varn, AnyT @@ oinds]]
AnyT is passed whatever the dual indices are in order to be an
appropriate "test tensor" against which expr may be integrated.
varn is the variation of the said expression, and then the function
IndexCoefficient is used to remove the test tensor.
There may be something wrong with the generality of the above code,
but it worked on some (overly) simple test cases I ran.
Cheers
Leo
PS In general it's recommended to stay away from using string
manipulation to do symbol manipulation.
I don't know if this is relevant for you, but just making sure it's
out there and it doesn't surprise anyone.
Leo