But Bacher hit Tyrell Sutton on a 17-yard pass, Sutton had a 10-yard run, Lane caught a 15-yarder and Bacher took off for 10 yards to move the ball to the 11, setting up the final TD.
The Hoosiers (6-5, 2-5 Big Ten) got one last chance after Northwestern's kickoff went out of bounds. Lewis hit passes of 13 yards to Andrew Means and 14 yards to Ray Fisher to get the ball to the Wildcats' 34.
But Northwestern defensive end David Ngene hit Lewis and the ball popped loose with Adam Kadella recovering at the 38 with 12 seconds to go.
Officials then reviewed the play to see if Lewis' arm was moving forward, but the call on the field stood and Northwestern (6-5, 3-4) had a victory. The Wildcats moved into position for a bowl bid, but they will probably need to win at Illinois next week.
Indiana, hoping for its first bowl since 1993, closes it season against Purdue.
Northwestern led 24-14 in the third quarter, apparently gaining momentum after a 70-yard TD pass from Lewis to Fisher was overturned by video replay because the quarterback had crossed the line of scrimmage.
Lane's 27-yard catch of a Bacher pass set up a 1-yard TD run by Sutton as Northwestern took a 17-14 lead.
The Wildcats then drove 74 yards for another score as Brandon Roberson took a handoff from Bacher and threw a 15-yard option pass to Kim Thompson, who hung on for the score even after Indiana's Tracy Porter tipped the ball. That play was also reviewed and the call on the field upheld, as the Wildcats went up 24-14.
But Hardy, who earlier became Indiana's career leader in both receptions and pass catch yardage, caught a 38-yard pass from Lewis and moments later took another pass and maneuvered his way into end zone from 11 yards away -- his 14th TD catch this season, another Indiana record -- to make it 24-21.
Northwestern moved right back to the Hoosiers 3, but Bacher's third-down pass to the end zone was picked off by Porter with 10:19 to go and Indiana then went 80 yards for the go-ahead score.
The Hoosiers had a 14-10 halftime lead, thanks to James Bailey's 91-yard kickoff return and Lewis 14-yard TD run.
Trailing 14-3, the Wildcats went right down the field again -- they got inside Indiana's 15 on their first three possessions -- as Sutton broke off a 46-yard run. But when Bacher threw a strike to Lane in the end zone, the ball bounced off the receiver's hands and then his leg before landing right to Indiana's Austin Thomas for the Hoosiers' second interception of the game.
But Indiana gave it back quickly.
Backup quarterback Ben Chappell, who'd attempted one pass all season, entered the game to replace Lewis, when he was shaken up after being hit on a pass attempt.
Chappell's second attempt of the season and one play of the game was disastrous. His ill-timed pass was easily intercepted by Northwestern linebacker Eddie Simpson, who returned it 41 yards for a TD that cut the Hoosiers' lead to 14-10 with just five minutes left in the half.
Hardy, who trailed Courtney Roby (170) by one catch coming in, made two receptions during the 80-yard scoring drive to set the school career record. His 13- and 10-yard catches and a 21-yard run by Bryan Payton keyed a drive that ended when Lewis faked to the middle and carried around left end for a 14-yard TD that made it 14-3.
Hardy also set the career record for receiving yards, passing Roby (2,524) with a second-quarter catch. He finished with seven catches for 107 yards.
Sutton gained 141 yards rushing on 33 carries.