The reasons are twofold. First of all, CVX is not a symbolic processing engine; it assembles every subexpression as it is constructed. And secondly, every subexpression must obey the ruleset. So CVX sees G^TMGfirst, which is not DCP compliant, and rejects it.

If M_1 and \Lambda_1 are positive semidefinite, then that first term in the trace is equivalent to square_pos(norm(sqrtm(M1)*G*sqrtm(L1))).