Hm, I found the point in the man page now. It was imho a bad decision to change the behaviour of the (()) expression. Why should a successful expression return a non zero exit code?
You are aware what $? means, yes? It's a return code. It is not a mathematical result, but it is the result of the expression.
The result of the expression (( X = 0 )) is zero, which considered as a boolean means false, which as a return code means failure, so $? becomes 1.
The result of (( X = 1 )) is nonzero, which considered as a boolean means true, which as a return code means success, so $? becomes 0.
It does this because this is how mathematical functions work in most languages, which is what (( )) is for. If you don't want to do that, there's the old fashioned way.
The entire reason (( )) exists is it behaves differently. (( )) is a modern C-style expression where you can mix assignments and comparisons, with a return code like you'd expect of such expressions. It's the modern way to do math and comparison in Bourne shell.
If this is inconsistent with the math syntax of plain Bourne circa 1977, well, good. There's a reason it's considered depreciated for modern shells.