Garnett scored 26 points to lead the Timberwolves, who have lost consecutive games after a four-game winning streak.
"My play was pure horrible tonight," Garnett said. "I was pretty passive in the second half, and I can't make a pass like that."
Bell said he duped Garnett into making a mistake.
"I kind of faked like I wasn't paying attention, and looked to the guy under the basket," Bell said. "And it came right to me.
"Once I got the steal, I just put on the afterburners and just took off."
The Bucks led 103-102, after Minnesota's Mike James hit a jumper with 1:05 remaining.
Garnett got his hands on a loose ball on Milwaukee's next possession, but Bell stole the ball right back. He then ran down the floor for a layup and was fouled by James on the play and made the free throw to put Milwaukee ahead by four.
Bell fouled Ricky Davis with 29.7 seconds remaining, but Davis made only one of two shots. Then Garnett went to the line with 5.1 seconds left, missing the first and making the second.
"I just don't like the way I'm playing right now," Garnett said. "I guess I need to watch film and figure out a way to get better."
Williams went to the line 1 second later, sealing the game with two free throws -- one night after the Bucks missed 18 free throws in a loss to Chicago.
"They made their foul shots down the stretch, and they came at us with a lot of energy," Timberwolves coach Dwane Casey said.
Mark Blount added 16 points and a team-high 10 rebounds for the Timberwolves, who have lost three straight annual trips to the Bradley Center.
Andrew Bogut had 16 points and a team-high 11 rebounds for Milwaukee, which has won four straight at home. Bell added 16.
"The effort tonight, fourth game in five nights after back-to-back losses, was a good win," Milwaukee coach Terry Stotts said.
After a scoreless first quarter, Redd scored 15 of the Bucks' 24 points in the second quarter and had three 3-pointers in the first four minutes of the third.
With Redd in mild foul trouble, Stotts rested his star for nearly four minutes to begin the fourth. Still, the Bucks led 85-82 when Redd re-entered the game at the 8:07 mark.
Garnett hit two free throws, but Redd answered with a turnaround jumper to begin an 11-4 run that put the Bucks ahead 96-88 with 4:15 remaining.
The Timberwolves rallied with three-point plays on back-to-back possessions by Garnett and James, and Blount hit an open jump shot to cut the Milwaukee lead to 98-96 with 2:58 remaining.
Redd was called for a technical after he appeared to get a clean block of Trenton Hassell's shot late in the third quarter. Redd was called for a foul and laid down on the floor in disbelief after the call with 1:57 remaining in the second quarter.
Redd said even the official told him that he didn't deserve the call, but had to make it under new NBA rules that demand tighter scrutiny of players who complain about calls.
"I think it's unfair," Redd said. "I wasn't cussing him out or anything like that."
Redd's only other technical foul came in a playoff game against New Jersey on April 29, 2003.
- The Bucks were playing without forward Charlie Villanueva, who was inactive because of tendinitis in his right shoulder. Villanueva returned on Dec. 8 after missing 10 games with an elbow injury.
- Minnesota is the only team in the NBA to use the same starting lineup in every game.
- Garnett received a technical after for arguing after he was called for carrying with 30.1 seconds left in the first half.