Почему нужно было помимо класса String создавать дополнительные классы по типу StringBuilder?
Потому, что String - иммутабельный класс. Чтобы конструировать строки как раз добавлены StringBuffer (в версии 1.0) и StringBuilder (в 1.5).
В данном примере строка s спокойно изменяется путем конкатенации, что аналогично sb.append
В итоге у вас каждый раз создается новый объект. Не всегда это бывает уместно.
2. Почему все методы StringBuilderнельзя было поместить в класс String, чтобы не плодить классы строк?
Потому, что это нарушает принцип единой ответственности. Так же можно заметить, что мысль не стоит на месте и со временем появляются новые методы для конструирования строк.
3. Почему s.equals(sb) равно false, если мы сравниваем только значения, а не ссылки
Потому, что вы сравниваете разные объекты. StringBuilder - это не String.