After a sterile first 60 minutes, Stephane Sessegnon fired the Baggies into the lead with a powerful shot.
Stoke created little in the second half but substitute Jonathan Walters headed them level from a superb Joselu cross.
Almost immediately, the visitors' Geoff Cameron was sent off for striking Claudio Yacob before Evans tapped home after a goalmouth scramble.
Relive how West Brom beat Stoke here
Stoke had two men sent off within the first 30 minutes in the reverse fixture in August and needless indiscipline proved costly again at The Hawthorns.
The red card for Cameron, in reaction to a Yacob challenge, came much later in the game - the 82nd minute - but it followed within 60 seconds of substitute Walters heading an undeserved equaliser.
From being in a position where they could have stolen an unlikely three points, Mark Hughes' men were forced back on to the back foot.
The Baggies piled on the pressure, won a 93rd-minute corner and, after the ball pin-balled around the six-yard box, centre-half Evans tapped home his first goal for the club as Stoke appealed for offside in vain.
Media playback is not supported on this device
Former Stoke boss Tony Pulis has now lost only once in 11 matches when managing in this fixture after West Brom won their second game in a row to move further away from the relegation zone.
The home team totally dominated the second half, having 11 shots to Stoke's three, and striker Rickie Lambert blew a great opportunity to put them 2-0 up when he miscontrolled after being put clean through.
Walters punished them almost immediately, but Evans, who along with captain Darren Fletcher performed superbly throughout, was in the right place as Stoke became the final team this season to concede in the Premier League from a corner.
Fletcher, who covered a match-high 11.03km, was key to the opening goal, winning possession and surging forward before finding James Morrison, who set up Sessegnon for his first league strike in over a year.
Pulis' men kept 17 league clean sheets in 2015 and, although they could not do so in their first match of 2016, they looked secure at the back for virtually the whole game and climb to 12th, just three points behind Stoke.
Stoke named an unchanged team for the third match in succession after wins over Manchester United and Everton but, having scored four at Goodison on Monday, offered little threat at The Hawthorns.
Bojan, Marko Arnautovic and Xherdan Shaqiri linked up brilliantly at Everton but Evans and Gareth McAuley virtually nullified them, with the Swiss managing one tame shot in the second half.
Walters' goal came from nowhere, created by a rare moment of quality from fellow substitute Joselu, but they are still only four points from fifth-placed Manchester United in 10th and in a good position to climb the table in the second half of the season.
Media playback is not supported on this device
Stoke boss Mark Hughes: "I don't think it was a high-quality game - we didn't play particularly well and I didn't think West Brom played particularly well.
"Geoff got caught late by the lad Yacob, he's just reacted to it and pushed the guy. We're not too happy with the reaction of the West Brom player. I think he went down really easily with the intention of maybe getting Geoff sent off, which he succeeded in doing.
"We'll look again tomorrow and we'll decide whether or not we appeal. At the moment, having seen it, that is probably what we will do."
West Brom boss Tony Pulis: "Stoke have been flying and are a real high-quality team and we are very pleased to win.
"The equaliser would have given them momentum but the lad being sent off means it goes back our way."
West Brom host Bristol City in the third round of the FA Cup next Saturdaybefore a league trip to Chelsea on 13 January, while Stoke are at home to Liverpool in the first leg of their League Cup semi-final on Tuesday. After an FA Cup trip to Doncaster on 9 January, their next league game is home to Norwich on 13 January.
Jonny Evans grabbed a stoppage-time winner for West Brom as Stoke suffered just their third defeat in 13 matches.