На самом деле там происходит большая магия. Весь ваш стек на момент создания блока копируется в другой блок памяти. В итоге переменная i в блоке не таже самая, что i вне блока.
UPD. Если вы хотите чтобы везде i был один и тот же, используйте __block
__block int i = 10;
void (^block) (int) = ^(int x){
NSLog(@"%d", i); // 11
};
i++;
block (i);