Here is a linear-time method. The idea is to Sow positions where a cleave should occur, then construct the sublists from those positions.
cleaveList[ll_List, val_, rlen_] := Module[
{j = 0, k = 0, posns, td, res},
posns =
Flatten[Append[
Prepend[Reap[
Fold[(k++;
If[#2 < val, j++; If[j == rlen, Sow[k]; j = 0], j = 0];) &,
0, ll]][[2]], 0], Length[ll]]];
res = Table[
ll[[posns[[j]] + 1 ;; posns[[j + 1]]]], {j, Length[posns] - 1}]]
The reference example:
In[368]:= cleaveList[{1, 2, 3, 8, 4, 2, 6, 7, 3, 2, 1, 9, 8, 9, 1, 3,
1, 2, 9, 2, 8, 2, 7, 7, 1, 2, 3, 4, 3, 2, 1}, 5, 3]
(* Out[368]= {{1, 2, 3}, {8, 4, 2, 6, 7, 3, 2, 1}, {9, 8, 9, 1, 3,
1}, {2, 9, 2, 8, 2, 7, 7, 1, 2, 3}, {4, 3, 2}, {1}} *)
It is straightforward to assess the speed.
In[369]:= Table[
ll = RandomInteger[8, 2^n];
Timing[cp2 = cleavePosns2[ll, 5, 3]; Length[cp2]]
, {n, 14, 22}]
(* Out[369]= {{0.038943, 1532}, {0.050557, 3092}, {0.094123,
6107}, {0.189573, 12010}, {0.409559, 24282}, {0.811616,
48129}, {1.6438, 96797}, {3.02218, 193246}, {6.49907, 385671}} *)