Ciao Pietro,
occhio che stai commettendo un errore
MOOOOOOOLTO subdolo

Nel tuo esempio fai una cosa parecchio strana, perché invochi la dispose dell'istanza originale all'interno del metodo Resize, e passando l'argomento per riferimento, provi a SOSTITUIRE il riferimento di bmp alla nuova immagine clonata.
Se questo è assolutamente lecito nel blocco try..finally, lo stesso non può dirsi per il blocco Using. Infatti quando istanzi una variabile locale tramite un blocco Using, essa è readonly all'interno del blocco. Ciò significa che non puoi assegnarle un'altra istanza di oggetto. Il compilatore C# solleva un errore in casi come questo, dicendoti che la "local variable è readonly". Il compilatore VB è invece molto più permissivo, ma a runtime
ignora l'assegnamento che fai dentro Resize anche se hai passato l'argomento per riferimento.
Te ne puoi accorgere facilmente modificando un il codice in questo modo:
Dim b As Bitmap
Protected Sub Resize(ByRef bmp As Bitmap, ByVal width As Integer)
'creo una nuova Bitmap
b = DirectCast(bmp.Clone(), Bitmap)
'chiudo bmp altrimenti rimane sempre "in uso" e non si può modificare
bmp.Dispose()
'restituisco la nuova Bitmap, che ho passato per riferimento
bmp = b
End Sub
e poi usando Debug.Assert per verificare che fine fanno le istanze:
Dim bmp As Bitmap = Nothing
Try
bmp = New Bitmap(500, 500)
Resize(bmp, 100)
Debug.Assert(b.Equals(bmp))
bmp.Save("c:\tmp\tmp.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
Finally
bmp.Dispose()
End Trye
Using bmp As New Bitmap(500, 500)
Resize(bmp, 100)
Debug.Assert(b.Equals(bmp))
bmp.Save("c:\tmp\tmp.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
End UsingSai qual è il risultato? che il secondo Debug.Assert fallisce, perché bmp è rimasta quella di prima.
In ultima analisi, l'argument exception che ottieni è causata dal fatto che stai provando a fare il Save di un bitmap disposed (perchè hai invocato Disposed dentro resize).
Morale della favola: Using e try...finally sono simili,
MA NON ESATTAMENTE UGUALI 
Ciao!