Mathematica 159 140 134
Editar : una reescritura completa, utilizando recursión ( NestWhile). Mucho más rápido y sin esfuerzo desperdiciado.
Código
g@n_:=StringTake[NestWhile[#~StringReplace~{"A"-> "ABCBACBCABCBA","B"-> "BCACBACABCACB",
"C"->"CABACBABCABAC"}&,"ABC",StringLength[#]<n&],n]
Uso
Se tarda aproximadamente 1/40 segundos en generar una palabra libre cuadrada ternaria con un millón de caracteres.
g[10]
g[53]
g[506]
AbsoluteTiming[g[10^6];]

Verificando
f probará si una cadena está libre de cuadrados.
f[s_]:=StringFreeQ[s, x__~~x__]
Verificando las salidas anteriores y un caso en el que aparece la cadena "CC".
f@Out[336]
f@Out[337]
f@Out[338]
f["ABCBACBCABCBABCACBACCABCACBCABACBABCABACBCACBACABCACBA"]
Verdadero
Verdadero
Verdadero
Falso
exec"x+=[1-y for y in x];"*nahorra 6 caracteres a expensas de la eficiencia, pero bueno, ¡esto es golf!