Parameter expansion isn’t the same as arithmetic evaluation.
In an arithmetic expression, a text string such as
a is interpreted as a variable name, and the value of that variable is processed as an arithmetic expression itself, and the result used in the containing arithmetic expression. Thus
$((a * 3))
causes the value of the variable
1+1, to be evaluated as an arithmetic expression, yielding
2, and the whole expression becomes
$((2 * 3)), i.e.
In the same context,
$a is replaced with the value of
a as-is, in an earlier phase (this is parameter expansion); so
$(($a * 3))
$((1+1 * 3)), which is
4 following the usual precedence rules.
In the second example,
$((++a)) is processed before
$b (processing takes place from left to right). The arithmetic expression causes
a to be evaluated as an arithmetic expression itself, as above; the value of
a=b++, which when evaluated, assigns the value of
b (itself evaluated as an arithmetic expression) to
a, then increments
b. Thus after evaluating
a and returns its value, which is now
$b is just replaced with the value of
2 as well. After the quoted argument to
echo is processed, the
echo is run with
2 2 as its sole argument, producing the output you saw.