Q:

Caesars Cipher не работает

Не могу найти ошибку. Со знаками, не являющимися буквами, еще не разбирался.
function rot13(str) {

  for (i=0; i<str.length; i++) {
    var symbCode = str.charCodeAt(i);

    if (symbCode >= 77) {
    symbCode -= 13;}

    else {
      symbCode += 13;}

    var symbFromCode = String.fromCharCode(symbCode); 
    str = str.replace(str[i], symbFromCode);

  }

  return str;
}

// Change the inputs below to test
rot13("SERR PBQR PNZC");

A:

    str = str.replace(str[i], symbFromCode);

Вы же заменяете не символ по конкретному индексу, а первое вхождение. После замены у вас каша произойдет:
SERR -> FERR
FERR -> FRRR
FRRR -> FERR //так как заменится первая R, а не вторая, как вы предполагаете
FERR -> FEER //и т.д.
Лучше формируйте новую строку в отдельной переменной и её возвращайте:
function rot13(str) {
  result = '';
  for (i=0; i<str.length; i++) {
    var symbCode = str.charCodeAt(i);

    if (symbCode >= 77) {
    symbCode -= 13;}

    else {
      symbCode += 13;}

    var symbFromCode = String.fromCharCode(symbCode); 
    result = result + symbFromCode;

  }

  return result;
}

