Non nel senso di String (java.lang.String). StringBuilder (insieme a StringBuffer) è semplicemente un "costruttore" di stringhe. Rappresenta una sequenza "mutabile" di caratteri. Al contrario di String che invece è immutabile.
Sì, e ci sono svariati altri metodi per mutare la sequenza di caratteri rappresentata nel StringBuilder/StringBuffer.
Non ho ben capito il tuo dubbio .... il toString() di StringBuilder è la ridefinizione (override) del toString() di Object. Ovviamente la implementazione in StringBuilder è fatta per restituire un String "finale" con la sequenza di caratteri rappresentata da StringBuilder in quel preciso momento.
Il codice che hai postato è semplicemente la composizione dinamica di una stringa basandosi sul risultato di tutti gli append fatti a fronte di cicli/condizioni e quant'altro.