Here is a brute-force algorithm for four-letter word squares (not cubes) that takes about a second on a three-year-old laptop.
findWordSquare[first_String] /; StringLength[first] == 4 :=
Module[{words = Select[DictionaryLookup[{"English", All}],
StringLength[#] == 4 &], secondlist, thirdlist,
f2 = StringTake[first, {2}], f3 = StringTake[first, {3}], f4 = StringTake[first, {4}]},
secondlist = Flatten[StringCases[words,
f2 ~~ LetterCharacter ~~ LetterCharacter ~~ LetterCharacter] /. {} -> Sequence[]];
thirdlist = DeleteCases[{#, Flatten[StringCases[words,
f3 ~~ StringTake[#, {3}] ~~ LetterCharacter ~~
LetterCharacter] /. {} -> Sequence[]]} & /@ secondlist, {_, {}}];
Flatten[Table[{first, #1, #2, #3[[i]]}, {i, Length[#3]}] & @@@
Flatten[(DeleteCases[Table[{#[[1]], #[[2, i]],
Flatten[StringCases[words,
f4 ~~ StringTake[#[[1]],{4}] ~~ StringTake[#[[2, i]],{4}] ~~ LetterCharacter] /.
{} -> Sequence[]]}, {i, Length[#[[2]]]}], {__, {}}] & /@ thirdlist), 1], 1]]
The output is a list of solutions given the first word.
EDIT
Here is a version for five-letter words. I have been unable to work out a simple generalisation to avoid coding them up separately. This takes about 40 seconds on my machine, compared with a couple of seconds for four-letter words. There are actually 76 squares starting with "faced".
findWordSquare[first_String] /; StringLength[first] == 5 :=
Module[{words =
Select[DictionaryLookup[{"English", All}],
StringLength[#] == 5 &], secondlist, thirdlist, fourthlist,
f2 = StringTake[first, {2}], f3 = StringTake[first, {3}],
f4 = StringTake[first, {4}], f5 = StringTake[first, {5}]},
secondlist = Flatten[StringCases[words,
f2 ~~ LetterCharacter ~~ LetterCharacter ~~ LetterCharacter ~~
LetterCharacter] /. {} -> Sequence[]];
thirdlist = DeleteCases[{#, Flatten[StringCases[words,
f3 ~~ StringTake[#, {3}] ~~ LetterCharacter ~~
LetterCharacter ~~ LetterCharacter] /. {} -> Sequence[]]} & /@ secondlist, {_, {}}];
fourthlist = Flatten[Table[{#1, #2, #3[[i]]}, {i, Length[#3]}] & @@@
Flatten[(DeleteCases[Table[{#[[1]], #[[2, i]],
Flatten[StringCases[words, f4 ~~ StringTake[#[[1]], {4}] ~~
StringTake[#[[2, i]], {4}] ~~ LetterCharacter ~~
LetterCharacter] /. {} -> Sequence[]]}, {i, Length[#[[2]]]}], {__, {}}]
& /@ thirdlist), 1], 1];
Flatten[Table[{first, #1, #2, #3, #4[[i]]}, {i, Length[#4]}] & @@@
DeleteCases[({#[[1]], #[[2]], #[[3]],
Flatten[StringCases[words, f5 ~~ StringTake[#[[1]], {5}] ~~ StringTake[#[[2]], {5}] ~~
StringTake[#[[3]], {5}] ~~ LetterCharacter]]} & /@ fourthlist), {__, {}}], 1]]