SetTimeOut возвращает отрицательное значение?
8.4 TimersEach object that implements the WindowTimers interface has a list of active timers. Each entry in this lists is identified by a number, which must be unique within the list for the lifetime of the object that implements the WindowTimers interface.
Это число и оно должно быть уникальным в пределах данного объекта, реализующего этот интерфейс. То есть спека не запрещает ему быть отрицательным. То есть это implementation specific. 
Я бы не стал полагаться, что оно может быть отрицательным или только положительным. А вам критично разграничивать?
static int timeoutId()
{
    static int lastUsedTimeoutId = 0;
    ++lastUsedTimeoutId;
    // Avoid wraparound going negative on us.
    if (lastUsedTimeoutId <= 0)
        lastUsedTimeoutId = 1;
    return lastUsedTimeoutId;
}
исходя из этого кода - негативным timeoutID быть не может. Там есть проверка, если все id-шки закончились и пошло переполнение - то ресетится в единицу. Но это хром. В других браузерах может быть все совсем по другому. Главное не привязывать логику к формату timeoutID и все будет хорошо.