SequenceSplit, Longest, Plus
==========
I think it's best to take advantage of the built-in [`SequenceSplit`](https://reference.wolfram.com/language/ref/SequenceSplit.html) and ask for the [`Longest`](https://reference.wolfram.com/language/ref/Longest.html) pattern with the [`Condition`](https://reference.wolfram.com/language/ref/Condition.html)(`/;`) that it adds up ([`Plus`](https://reference.wolfram.com/language/ref/Plus.html)) to less than 20 (`<20`).
SequenceSplit[alist, {Longest[a__]} /; Plus[a] < 20 :> {a}]
It's reasonably short and idiomatic and doesn't create any lingering definitions. I am looking forward to seeing various other answers. Nice question!
Performance
---
This is rather slow for long lists, measuring with [`AbsoluteTiming`](https://reference.wolfram.com/language/ref/AbsoluteTiming.html) at various lengths.
ListPlot[
Table[
{l, First@AbsoluteTiming[
SequenceSplit[
RandomInteger[{1, 10}, l]
, {Longest[a__]} /; Plus[a] < 20 :> {a}
];
]
}
, {l, 10, 1200, 50}
]
, PlotTheme -> "Scientific"
, FrameLabel -> {"List length", "Time [s]"}
]
[![enter image description here][1]][1]
This is in a rather old i7-4770 CPU @ 3.40GHz
[1]: https://i.sstatic.net/Vrm04.png