Потому что объекты сравниваются по ссылкам, если две ссылки ведут на один и тот же объект, то получаете true, иначе - false. Чтоб в первом и втором случае было true надо серьезно переработать код, так как он возвращает {...} каждый вызов функции создает новый объект, и возвращает. Использование this внутри функций A и B не оправдано, создает мусор. При сравнении >= js пытается привести оба операнда к числу, и если память не изменяет, сначала ищет метод toValueOf, а если его нет - приводит к строкам, с помощью метода toString, в Вашем случае есть метод toString, и так как объекты с одинаковыми значениями полей age >= дает true, так как из объектов вызывается неявно toString.