Quins remain top but failed to score a try for the second match in a row as the league leaders found Bath in fantastic defensive form while Donald was clinical with the boot.
The victory moves Bath up to fifth and Donald, who kicked New Zealand to World Cup victory last year, believes it was a performance that will reverberate throughout the Premiership.
"It's a very significant win for Bath," said Donald. "They are not the champions for nothing and we knew that we were going to have to be at our best to beat them.
"The conditions didn't really suit much attacking rugby so it became a kicking battle and we came out on top of that which is very pleasing.
"It was pretty tight at the end there but we showed some composure at the end there and I'm sure the coaches will be pretty pleased with that.
"We're proud of the performance we produced, we did a really good job out there."
Quins began brightly and Evans kicked his side ahead but Donald levelled before Matt Banahan failed to produce the right pass for Semesa Rokoduguni, who had the try-line beckoning in front of him.
Evans made it 6-3 to Quins before Donald hit two quickfire penalties to give Bath the lead at the break.
The second half followed a familiar pattern and every time Evans levelled, Donald responded and was able to put his side 21-15 up with just seven minutes left.
Evans pulled one back but Bath stood firm in the closing stages, much to the annoyance of Quins director of rugby Conor O'Shea.
"I definitely wouldn't say it was a case of us not wanting it enough," said O'Shea. "It was a kicking game and we gave away too many free-kicks and penalties in kickable areas.
"It's a battle out of the war which is 22 matches across the season - that's the nature of the Premiership.
"It was always going to be a one-score game and we just gave away too much in the wrong areas.
"It's not a concern that we've not scored tries in the last two matches, we've scored 26 tries from our first eight games. I think there are other aspects of our game that I will worry about more."
Bath Rugby: Abendanon; Eastmond, Rokoduguni, Banahan, Biggs; Donald, Claassens; Beech (Cotter, 77), Mears (Sharman, 77), Perenise, Hooper, Attwood (Day, 50), Ovens, Mercer, Taylor
Not used: Palma-Newport, Caldwell, Skuse, McMillan, Cuthbert
Harlequins: Williams; Monye (Stegmann, 49), Hooper, Turner-Hall, Smith; Evans, Dickson; Lambert, Gray (Buchanan, 69), Collier (Sinckler, 71), Kohn, Robson, Guest (Trayfoot, 66), Wallace, Easter
Not used: Marfo, Brown, Burns, Clegg
Penalties: Donald 7
Penalties: Evans 6
Referee: JP Doyle