1. Nie, nie musi. Jedyny warunek to podanie zmiennej będącej funkcją.
2. Timery nie stanowią jakiegoś problemu jeśli chodzi o wydajność, poczytaj o eventloopie jak chcesz wiedzieć więcej.
3. Timer wywołuje po określonym czasie następny timer.
4. Jeśli chodzi ci o "wyścig" wywołania obu zdarzeń to tak, najfajniej to zrobić przez Promise.race.