Почему код именно так работает?
Потому что '0' - это совсем не нуль. Это ASCII-символ нуля с кодом 0x30. Поэтому сложив 10 (0xA) и '0' (0x30) Вы закономерно получили 0x3A :) Что является ASCII-кодом ':' 
Есть замечательный отладчик gdb, который может показывать изменение переменной в процессе работы программы и которым настоятельно рекомендуется пользоваться в спорных моментах. Вот например данная ситуация решается им в течение пары минут :)
Символы повторяются из-за static?
Не из-за static, а из-за того, что _itoa всегда возвращает один и тот же адрес. Попробуй так, зацени разницу:char *_itoa(int i) {
  static int slot;
  static char buf[10][2];
  slot = (slot + 1) % 10;
  buf[slot][0] = i + '0';
  buf[slot][1] = '\0';
  return buf[slot];
}

int main() {

  printf("%s + %s = %s", _itoa(2), _itoa(2), itoa(4));
  _getch();
}