I think I found a solution: changing ContractMetric1 (which in turn requires to change differentexpressionsQ) to allow a Wedge:
differentexpressionsQ[expr1_WWedge, expr2_List] :=
differentexpressionsQ[List @@ expr1, expr2]
(CM : ContractMetric1[{od_, aud_}, {metric_, nv_}])[
rest_. HoldPattern[Wedge[der_?FirstDerQ[expr1_], expr2_]] met :
metric_[b_, c_]] :=
Module[{dm = der[met], result},
If[(od || dm === 0) &&
differentexpressionsQ[result = CM[expr1 met], {expr1, met}],
rest Wedge[CM[der[result]], expr2] -
rest Wedge[CM[dm expr1], expr2],
rest Wedge[CM[met der[expr1]], expr2]
]] /; (MemberQ[FindFreeIndices[expr1],
ChangeIndex[c] | ChangeIndex[b]] && Head[expr1] =!= metric)
In the notebook you can see the code in action.
It would be nice to have this possibility included in xAct since xAct allows to define new products (or at least in xTerior).
Best and thanks,
Juan