Di motivi per non restituire nulla ce ne sono tanti;
Ad esempio una funzione 'void DrawRectangle(...)' svolge un compito ben preciso (disegnare un rettangolo, ma può essere qualsiasi altra cosa) e non deve restituire nulla.
Moltissimi metodi di classe sono void in quanto operano sui campi dell' oggetto e non devono restituire nessun valore, ad esempio un metodo 'void MyClass::Clear()' fà delle opearzioni di pulizia (ad esempio svuota un array) e non ha valore di ritorno.
A volte una funzione deve alterare un oggetto passato per riferimento, ad esempio void FaiQualcosa(MyClass& c), altererà l' oggetto ricevuto per riferimento e non ha valore di ritorno.
Altre volte un solo valore restituito è troppo poco, te ne servono più d' uno, in questi casi usi il passaggio per riferimento e spesso per motivi di chiarezza rinunci a usare il valore di ritorno ad esempio, 'void CalcolaPerimetroEArea(double raggio, double& perometro, double& area)'.