Это было дизайнерское решение, с которым разработчики Java пошли в глубь веков. Я считаю, что каждый объект поставляется с реализациями нескольких базовых методов (hashCode, equals, wait, notify), без необходимости их написания. Это имеет целый ряд преимуществ - наличие реализаций для hashCode и equals делает такие вещи, как Sets и HashMaps, хорошо работающими; Наличие реализаций для уведомления и ожидания значительно упрощает многопоточное программирование.
Что касается того, что происходит за кулисами, я думаю, вам нужно изучить исходный код компилятора или JVM. Однако в этом нет особого смысла. Большинство разработчиков Java довольны тем, что каждый объект является объектом - это одна из тех вещей, которые делают Java такой, какая она есть.