Thomas sprängde hem för de förnedrade Robins i 94: e minuten efter att ha plockats ut av Nicky Ajose för att öka Swindon överlevnad chanser.
Fram till den punkten spelet saknade många klar-cut chanser, med båda lagen inte kan bryta dödläget.
Den första halvan var jämnt ifrågasatt och den första öppningen föll till promotion-chasing Millwall i den femte minuten när Lee Gregory sprang vidare till en lång spark från målvakt Jordan Archer men kunde bara hantera ett tamt skott från en snäv vinkel.
Swindons bästa chans till hälften kom i 21: a minuten när, efter några intrikata fotboll på kanten av Millwall box, Charlie Colkett tog ett skott avsett för rätt hörn bara för Archer att skjuta den bakom.
Swindon var det bättre laget i andra halvlek men kunde inte utnyttja sin dominans förrän Thomas sent heroiska.
Jonathan Obika verkade tidigare ha försummat möjligheten att rycka till sig segern när han inte kunde få en bra koppling på en rubrik.
Matchrapport från Pressföreningen
Matchen slutar, Swindon Town 1, Millwall 0.
Andra halvlek, Swindon Town 1, Millwall 0.
Mål!  Swindon Town 1, Millwall 0. Conor Thomas (Swindon Town) höger fotade skott från mitten av lådan till nedre högra hörnet.
Försök blockerat. Nicky Ajose (Swindon Town) höger fotade skott utanför lådan är blockerad.
Handboll av Lee Gregory (Millwall).
Dion Conroy (Swindon Town) visas det gula kortet för en dålig foul.
Foul av Dion Conroy (Swindon Town).
Fred Onyedinma (Millwall) vinner en frispark i anfallshalvan.
Charlie Colkett (Swindon Town) vinner en frispark i anfallshalvan.
Foul av Lee Gregory (Millwall).
Substitution, Swindon Town. Bradley Barry ersätter Nathan Thompson.
Nathan Thompson (Swindon Town) visas det gula kortet för en dålig foul.
Hörnet, Swindon Town. Förföljd av Mahlon Romeo.
Callum Butcher (Millwall) visas det gula kortet för en dålig foul.
Rohan Ince (Swindon Town) vinner en frispark i den defensiva halvan.
Foul av Callum Butcher (Millwall).
Hörnet, Millwall. Förföljd av Dion Conroy.
Försök blockerat. Jonathan Obika (Swindon Town) höger fotade skott utanför lådan är blockerad.
Rohan Ince (Swindon Town) vinner en frispark i anfallshalvan.
Foul av Shaun Williams (Millwall).
Försök missade. Jonathan Obika (Swindon Town) höger fotade skott från mitten av lådan är bara lite för hög.
Hörnet, Swindon Town. Sammankallad av Tony Craig.
Hörnet, Swindon Town. Förföljd av Mahlon Romeo.
Rohan Ince (Swindon Town) vinner en frispark i den defensiva halvan.
Foul av Shane Ferguson (Millwall).
Hörnet, Millwall. Förföljd av James Brophy.
Försöket räddades. Jonathan Obika (Swindon Town) huvud från mitten av lådan sparas i mitten av målet.
Hörnet, Swindon Town. Förföljd av Callum Butcher.
Substitution, Millwall. Shane Ferguson ersätter Steve Morison.
Substitution, Swindon Town. Lukas Norris ersätter John Goddard.
Substitution, Swindon Town. James Brophy ersätter Fankaty Dabo.
Försening över. De är redo att fortsätta.
Försening i match Lawrence Vigouroux (Swindon Town) på grund av en skada.
John Goddard (Swindon Town) vinner en frispark i defensiva halvan.
Foul av Fred Onyedinma (Millwall).
Foul av John Goddard (Swindon Town).
Fred Onyedinma (Millwall) vinner en frispark på högerkanten.
Försök blockerat. Jonathan Obika (Swindon Town) höger fotade skott utanför lådan är blockerad.
Fankaty Dabo (Swindon Town) vinner en frispark i anfallshalvan.
Foul av Fred Onyedinma (Millwall).
Substitute Conor Thomas gjorde en dramatisk stoppage-time vinnare som Swindon avslutade Millwalls 16-match oslagbar körning i League One.