The British number three claimed his first ever top-10 scalp with a 3-6 6-4 6-1 victory over the Austrian.
Evans, ranked 67, will now face Andrey Kuznetsov for a place in the final - with Viktor Troicki and Gilles Muller facing off in the other semi-final.
Evans battles past Millman to set up Zverev clash
Highlights: Dan Evans beats Dominic Thiem in Sydney
Evans made only his second ever ATP semi-final as he builds up to the Australian Open, which starts on Monday.
He had no answer for world number eight Thiem in the first set, with the Austrian breaking serve on two occasions.
However, Evans battled through a second set littered with breaks before powering to victory in the third thanks to three breaks with no reply.
He was self-deprecating after the stunning win, playing down his own qualities.
Evans: I don't have that much in my game
“The first set was pretty much what I thought was going to happen,” Evans said after going behind to his more favoured opponent.
“Just hang in there – I knew I would have to do a lot of running and try and put my game onto him, come forwards, and I did that in the end pretty good.
I don’t have that much in my game so I have to stay in rallies a long time and try and frustrate people – and I think that’s what I did pretty well today.
Of facing Kuznetsov, he added: “I played him at Wimbledon before and he beat me so it’s another tough match. He had a good win today so we will see what happens tomorrow.”
Evans battles past Chardy in tricky opener in Madrid
'Very challenging' - Djokovic: Most players experiencing mental and motivational issues