il pending non va benè perchè quel metodo se non sbaglio ti dice solo se ci sono connessioni in attessa di essere accettate o no, se non ci sono esci dal ciclo while e non accetti + connessioni.
il metodo AcceptSocket invece resta in attesa fino a quando non c'è una connessione disponibile e l'accetta.

per il problema di chiudere il socket:

Se la tua omunicazione non è in streaming, cioè se devi effettuare un solo scambio di dati e poi chiudere la connessione, basta che togli il ciclo while, magary puoi utilizzare un try catch finally per assicurarti della chiusura del socket a fine trasmissione.

Se la comunicazione è in streaming e decide il client quando chiudere il socket allora il codice che ho postato nell'altro thread ve bene, perchè alla chiusura della connessione la proprietà connected diventa false esce dal ciclo e termina anche il thread.
Se invece la proprieà connected non si aggiorna immediatamente esce al ciclo successivo con il break;