I've been able to speed up my code for doing the 4x4 KenKen by doing it row at a time
In[1]:= n = 4;
In[2]:= rn = Range[n];
In[3]:= colUnequal[l_List] :=
Select[l, And @@ (UnsameQ @@@ Transpose[#]) &]
In[4]:= addRow[l_List, p_List] :=
Join[#[[1]], {#[[2]]}] & /@ Tuples[{l, p}]
In[5]:= Timing @ Dimensions[p = Permutations[rn]]
Out[5]= {0., {24, 4}}
In[6]:= Timing @
Dimensions[ps = Select[p, Abs[Log[#[[3]]/#[[4]]]] == Log[2] &]]
Out[6]= {0., {8, 4}}
In[7]:= Timing @ Dimensions[a2 = Tuples[{ps, p}] ]
Out[7]= {0., {192, 2, 4}}
In[8]:= Timing @ Dimensions[a2s = colUnequal[a2]]
Out[8]= {0., {72, 2, 4}}
In[9]:= Timing @ Dimensions[a2s1 = Select[a2s, #[[2, 4]] == 2 &]]
Out[9]= {0., {12, 2, 4}}
In[10]:= Timing @
Dimensions[a2s2 = Select[a2s1, #[[1, 1]]*#[[1, 2]]*#[[2, 2]] == 12 &]]
Out[10]= {0., {4, 2, 4}}
In[11]:= Timing @ Dimensions[a3 = addRow[a2s2, p]]
Out[11]= {0., {96, 3, 4}}
In[12]:= Timing @ Dimensions[a3s = colUnequal[a3]]
Out[12]= {0., {8, 3, 4}}
In[13]:= Timing @
Dimensions[a3s1 = Select[a3s, Abs[#[[2, 3]] - #[[3, 3]]] == 2 &]]
Out[13]= {0., {3, 3, 4}}
In[14]:= Timing @ Dimensions[a4 = addRow[a3s, p]]
Out[14]= {0., {192, 4, 4}}
In[15]:= Timing @ Dimensions[a4s = colUnequal[a4]]
Out[15]= {0., {8, 4, 4}}
In[16]:= Timing @
Dimensions[
a4s1 = Select[
a4s, #[[2, 1]] + #[[3, 1]] + #[[3, 2]] + #[[4, 1]] == 11 &]]
Out[16]= {0., {1, 4, 4}}
In[17]:= a4s1[[1]]
Out[17]= {{1, 3, 2, 4}, {3, 4, 1, 2}, {4, 2, 3, 1}, {2, 1, 4, 3}}