Ciao Francesco, il crash dell'applicazione potrebbe anche essere causato da un problema di timeout.
Anche se la connessione non va in timeout, potrebbe andare in timeout il SqlCommand che se non erro di default è impostato a 30 secondi.
Potresti anche incorrere in un problema di DB corrotto e questo potrebbe spiegare il perchè il piano di esecuzione è buono e le performance pessime.
TI consiglio di eseguire DBCC CHECKDB per controllare il DB , DBCC DBREINDEX per ricostruire gli indici e di ricostruire le statistiche delle tabelle interessate dalla query con il comando UPDATE STATISTICS.
Se il problema persiste dovresti prendere in considerazione la possibilità che non sia un problema di dati ma un problema relativo alla struttura della query.
Se ci sono delle join ridondanti, la query potrebbe caricare una grande mole di dati, ricaricando gli stessi dati più volte. (una sorta di loop)
In questo caso la soluzione potrebbe essere quella di riscrivere la query , oppure dividere il processo in più passi utilizzando magari una stored.
A presto e buon lavoro.