Mathematica 159 140 134
Editar : Uma reescrita completa, usando recursão ( NestWhile). Muito mais rápido e sem esforço desperdiçado.
Código
g@n_:=StringTake[NestWhile[#~StringReplace~{"A"-> "ABCBACBCABCBA","B"-> "BCACBACABCACB",
"C"->"CABACBABCABAC"}&,"ABC",StringLength[#]<n&],n]
Uso
Demora aproximadamente 1/40 s para gerar uma palavra livre quadrada ternária com um milhão de caracteres.
g[10]
g[53]
g[506]
AbsoluteTiming[g[10^6];]

Verificando
f testará se uma string é quadrada livre.
f[s_]:=StringFreeQ[s, x__~~x__]
Verificando as saídas acima e um caso em que a string "CC" aparece.
f@Out[336]
f@Out[337]
f@Out[338]
f["ABCBACBCABCBABCACBACCABCACBCABACBABCABACBCACBACABCACBA"]
Verdadeiro
Verdadeiro
Verdadeiro
Falso
exec"x+=[1-y for y in x];"*neconomiza 6 caracteres em detrimento da eficiência - mas ei, isso é golfe!