Ecco il flusso delle informazioni che avviene quando premi il bottone:
prima di procedere con il submit deve eseguire il codice nell'onclick
cambia il value del bottone
disabilita il bottone
potrebbe inviare il comando al form, ma il bottone e` disabilitato.

Si potrebbe proseguire il tuo ragionamento e scrivere:
<input type ="submit" value = "invia" onclick="this.value='loading...';this.disabled=tru e;this.form.submit();">

Ma potresti inviare il form con il return e quindi cliccare sul submit.... e saresti daccapo.

Invece ti conviene:
<form ... onsubmit="this.bottvia.disabled=true;">
...
<input name="bottvia" type ="submit" value = "invia" onclick="this.value='loading...';">