A variável leitura está declarada como volatile?
Você tem certeza que sua thread sai em algum momento do método LeDados()? Pode ser necessário usar uma versão não bloqueante do método (tipo, que lê por um tempo máximo).
O que muitas vezes acontece é a thread estar parada no leDados. Nesse caso, a thread ficará esperando indefinidamente, já que esse método também não responde ao interrupt().
Se você trocar por uma versão não bloqueante do método (ou que bloqueie por um curto período de tempo), você poderá continuar verificando a sua variável de controle de tempos em tempos.
Uma coisa é certeza. Você até poderia tentar usar o suspend() e forçar a interrupção da thread. Mas pense nas consequências disso: A porta serial ainda estaria ocupado e isso certamente levaria o sistema a um estado muito feio e inválido. É por isso que não há um comando desses para interromper uma thread.
O que você deve fazer é garantir que seu código teste a condição de vez enquando. E para isso, não pode usar um método que possa bloquear o processamento ou esperar por um recurso para sempre.