They had to recover from Luke Leahy’s early headed opener, with Aiden O’Brien staying alert to divert home an equaliser.
Josh Vela’s late tackle then saw the hosts reduced to 10 men before the interval, but they seemed to be hanging on for a point.
That was until Thompson proved the unlikely goal hero to warm the hearts of the noisy travelling fans on a bitterly cold night in Shropshire.
Danny Cowley made four changes from the side that thrashed Doncaster on home soil in the previous outing.
O’Brien was handed a full debut, while Ryan Tunnicliffe made his first start since hurting his hamstring at the end of October.
Denver Hume and Mahlon Romeo returned to the wing-back roles, as Tyler Walker, Reeco Hackett, Marcus Harness and the injured Michael Jacobs made way.
There was a cagey opening in freezing – but thankfully dry – conditions and Sean Raggett nodded an early Ronan Curtis free-kick wide at the back post.
The first big opportunity arrived with 10 minutes on the clock, as the visitors were almost gifted an opener.
Elliott Bennett played a crazy ball across his own box and Curtis nipped in to flash a low shot narrowly past the post.
Shrewsbury hit back, though, and it took a brave headed clearance from Raggett to stop Matthew Pennington’s fierce effort from finding the net.
That was only a brief respite for the Blues, however, as their opponents went ahead from the resulting corner.
Bennett swung the ball into the box from the left and Leahy was left in far too much space to nod the ball home.
Pompey took a while to recover from that setback and the Shrews applied some pressure, without being able to carve out any further clear chances.
And they found themselves level on 29 minutes after Curtis lifted a dangerous pass into the mixer, where Marko Maroši, under pressure from Raggett, could only punch straight to Hume.
He fired in a shot that was flicked towards the net by O’BRIEN, with the ball just about crossing the line, despite the best attempts of Maroši to hook it clear.
Shrewsbury’s mood worsened soon after, as Vela’s reckless challenge on Curtis earned an immediate red card from referee Sebastian Stockbridge.
Pompey tried to make the most of their numerical advantage and threw plenty of players forward in search of the lead.
It almost arrived when George Hirst got on the end of a Curtis cross in stoppage-time, but Maroši made a fine save to deny the striker.
Shrewsbury Town 1
Cowley made an attacking switch at the break, with Harness replacing Hayden Carter, as the visitors switched to a back four.
But the Shrews had three corners in quick succession shortly after the restart, with Pompey just about managing to keep them at bay.
At the other end, Romeo swung in a dangerous delivery that was just out of reach for Hirst at the back post.
A cross from Hume was then only partially dealt with and O’Brien’s volleyed effort had to be gathered low down by Maroši.
Pompey’s second change arrived on 65 minutes, as goalscorer O’Brien made way for Walker to add fresh legs to the forward line.
They still had to remain alert at the other end and a fine free-kick from Leahy was glanced narrowly over by Pennington.
It was the Blues quickly back on the attack, though, and Walker’s deft flick from a Tunnicliffe delivery was kept out by Maroši.
Their final throw of the dice saw Hackett replace Romeo wide on the right for the contest’s final 10 minutes.
And he had a hand in the goal that put Pompey ahead, laying the ball off on the edge of the box after not being able to find space to shoot.
The grateful recipient was THOMPSON, who hit a superb strike just underneath the crossbar to open his account for the club.
Shrewsbury picked themselves up and threw everything at the Blues for the final few minutes, but there was to be no late drama.
Shrewsbury (3-5-2): Maroši; Ebanks-Landell (c), Pennington, Flanagan; Bennett (Janneh 87), Vela, Davis (Fornah 22), Leahy, Nurse; Bloxham (Bowman 75), Udoh
Goals: Leahy 14
Sent off: Vela
Subs not used: Burgoyne, Bondswell, Pierre, Daniels
Pompey (3-4-1-2): Bazunu; Carter (Harness 46), Raggett, Robertson (c); Romeo (Hackett 80), Tunnicliffe, Thompson, Hume; Curtis; Hirst, O’Brien (Walker 65)
Goals: O’Brien 29, Thompson 84
Subs not used: Webber, Ogilvie, Jewitt-White, Mingi
Referee: Sebastian Stockbridge
Attendance: 5,862 (724 Pompey fans)