That is actually a nice approach using the stepsize parameter to cycle:
\whitespace trim
\define cycle-palettes()
<$let stepsize={{{ [<modifier>match[alt]then[-1]else[1]] }}}>
<$set name=pals filter="[all[tiddlers+shadows]prefix[$:/palettes/Captivate]]">
<$action-listops $tiddler="$:/palette" $field="text" $subfilter="+[cycle<pals>,<stepsize>]"/>
</$set>
</$let>
\end