Почему этот код не работает?
Потому что date.getMonth внутри использует this, который с вашей магией теряется.
Вот так будет работать: magic(date.getMonth.bind(date));
https://habr.com/ru/company/ruvds/blog/422089/

Если хочешь чтоб работало так, как хочется тебе, то методы для объектов надо объявлять иначе.
class b {
  a = 123; 
  func = () => {
    console.log(this.a)
  }
}

function func(f) {
  return f()
}

func(new b().func) // 123

В твоем первом примере, при вызове функции, она не ссылается на объект, значит ей задается глобальный контекст. Второй пример аналогичен первому, и работает так-же, просто замени единицу на this.