The example given for arithmetic expansion also uses x=$(($x-1)): https://pubs.opengroup.org/onlinepubs/007904875/utilities/xc...
The update 2017 standard mentions ((..)) but not in the obvious place. It's under 'compound commands/grouping' ...
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V...
> If a character sequence beginning with "((" would be parsed by the shell as an arithmetic expansion if preceded by a '$', shells which implement an extension whereby "((expression))" is evaluated as an arithmetic expression may treat the "((" as introducing as an arithmetic evaluation instead of a grouping command. A conforming application shall ensure that it separates the two leading '(' characters with white space to prevent the shell from performing an arithmetic evaluation.
The simpler and possibly faster way is just
or ((i+=1))This syntax works in macos ksh, so pretty sure it's POSIX.
Also, ksh93 supports sequence generation.. so as an alternative to the loops, use