TerminateThread non va usata mai, dato che interrompe il thread esattamente là dove si trova in questo momento, senza rilasciarne le risorse; se ti va particolarmente male, potresti interromperlo mentre è nell'allocatore, e a quel punto qualunque new/malloc da tutti gli altri thread bloccherebbe il programma.
Non esiste una funzione di sistema per terminare un thread in maniera "pulita", anche solo per il fatto che il sistema non ne sa nulla delle risorse possedute dal tuo thread: la maggior parte delle risorse di sistema sono legate al processo, non al singolo thread, per non parlare delle risorse della tua applicazione (heap, connessioni a DB, ...), di cui il sistema non sa niente.
Di conseguenza, il modo corretto per far terminare il thread B dal thread A è fare in modo che A "parli" a B e gli dica di terminare, e questo lo faccia (facendo la return dalla funzione da cui è partito). Uno dei modi più semplici per fare ciò è semplicemente avere un flag condiviso (di un tipo atomico) che viene ciclicamente controllato nel thread B e, in base al suo valore, prosegue o termina.
In ogni caso, in molti casi - e specie in una situazione di tipo "producer-consumer" (un thread produce dei job da fare, gli altri thread in parallelo ci lavorano) - usare i thread a così basso livello è inutilmente complicato (oltre che inefficiente se lanci troppi thread), può essere un'idea migliore usare librerie che ti forniscano astrazioni di più alto livello (thread pool, map-reduce, job queues, message passing, modello ad "attori", ...).

Rispondi quotando