PHP: нужно ли создавать массив перед его заполнением?
На самом высоком уровне могут появиться варнинги, тем не менее такой подход допустим.

Если существует $a['a']['b']['c'], то и $a['a']['b'] должен существовать по определению.
Так что проверка родительских ветвей в данном случае излишна.
Считаю, что надо проверять в том случае, если вы не хотите перезаписать уже существующиее значение, т.е.

if (!isset($_SESSION['voted'][$voteId])) {
  // Ещё не голосовали, учитываем голос
  $_SESSION['voted'][$voteId] = time();
}

В остальных случаях проверка необязательна. Естественно, при этом если внутри используются какие-либо переменные — они должны проверяться отдельно на существование и на правильность типа. В данном случае надо убедиться, что существует переменная $voteId и имеет тип числа