McCarthy, a first-year starter who felt spurned by Ohio State in recruiting, finished 12-for-24 passing for 263 yards and ran for another 27 yards.
“He was just on fire in every way, running the ball or throwing it,” Michigan coach Jim Harbaugh said.
Second-ranked Ohio State (11-1, 8-1 Big Ten) did not score in the second half until Noah Ruggles knocked through a 27-yard field goal with 7:23 left in the fourth quarter.
One play later, Michigan (12-0, 9-0) scored again as Donovan Edwards went 75 yards on the first play.
He outdid himself the next time the Wolverines got the ball by squirting free for an 85-yard touchdown to set the final margin and punch Michigan’s ticket to a second straight Big Ten Conference championship game in Indianapolis.
Ohio State overcame multiple big defensive breakdowns to take a 20-17 lead into the halftime locker room.
The Buckeyes struck first, taking the opening kickoff and driving 81 yards in 12 plays for a 4-yard touchdown from C.J. Stroud to Emeka Egbuka.
Michigan countered with a 10-play, 44-yard drive that ended with the Wolverines settling for a 49-yard field goal by Jake Moody. McCarthy kept the drive alive with a pair of third-down completions, including a 33-yarder to Ronnie Bell, who got open when when McCarthy scrambled and Denzel Burke lost track him momentarily.
Next the Buckeyes took their turn settling for a field goal as Ruggles knocked through a 32-yarder to conclude a 10-play, 58-yard drive.
Michigan tied the score with a 69-yard touchdown pass from McCarthy to Cornelius Johnson. Ohio State defensive coordinator Jim Knowles brought an all-out blitz and got burned as McCarthy had to chuck a desperation pass toward Johnson, but he was able to haul it in, break a tackle and go the distance with 7:26 left in the second quarter.
Prior to that drive, Ohio State had outgained Michigan 186-48.
In the end, Michigan had a 530-492 advantage in total yards, including 252-143 on the ground.
“We matched through the course of the game, but too many explosives,” Knowles said after the Buckeyes gave up five plays of 45 yards or more. “And that’s what is disheartening for not just the defense, but the team, the fans. And I have to take responsibility for that.”
The Buckeyes went back on top with another Ruggles field goal, this one from 47 yards with 5:36 to go in the second quarter, but that lasted only one play.
A coverage bust allowed McCarthy to find a wide open Johnson over the middle for a 75-yard touchdown that put the Wolverines on top 17-13.
The Buckeyes’ answer was fast, though, as they needed only four plays to cover 79 yards. The last 42 came on a fade from Stroud to Marvin Harrison Jr., who stretched as far as he could to haul it in as he stumbled into the end zone.
Michigan running back Blake Corum started the game but carried twice then did not return after the first drive.
Edwards, who was playing with an injured hand, finished with 216 yards on 22 carries while Johnson had 160 yards on four catches.
Stroud threw for 349 yards while Egbuka had 125 yards receiving and Harrison added 120.
Michigan beat Ohio State in Ohio Stadium for the first time since 2000, also the last time the Wolverines won two games a row in a series they now lead 60-52-6.
The margin of victory was the largest for Michigan since a 28-0 upset in Ann Arbor in 1993, and it matched the most lopsided Michigan win at Ohio Stadium since a 22-0 knockout in 1976.