в setTimeout коллбэк который ты туда ложишь - он макро задача, в then коллбэк - микро задача
Сам timeout - макро задача.- сам вызов setTimeout - синхронный, а вот его коллбэк - он потом становится макротаской
Promise.resolve().then(setTimeout(() => test(4) /* MS1 */, 1000))
в этом участке кода ты возвраешь undefined , и из-за этого ошибка возникает скорее всего, потому что функция должна возвращать this