Zambrano (13-5) allowed four hits and struck out five in eight innings to improve to 6-1 at Minute Maid Park.
"I felt strong the whole game," said Zambrano, who threw 121 pitches.
"He's going to be a little sore," Houston manager Phil Garner said. "But right now, we're thinking he's going to be able to make his next start."
Zambrano, who had a one-hit shutout in Houston on June 5, spent most of this night avoiding trouble. His outing also included seven walks, a wild pitch and a hit batter. However, the flustered Astros -- with an NL-worst .258 batting average -- stranded nine runners and dropped their third straight game.
"If you walk somebody, you just have to get the next hitter out," Zambrano said. "You can't be frustrated about walks or who is on base. If you've got good stuff that night, you're good enough to get the next hitter out."
Cubs manager Dusty Baker didn't hesitate to send Zambrano out for the eighth. After walking Aubrey Huff, Zambrano retired the next three in order.
"He was still dealing, he was still throwing the ball good," Baker said. "It's hard to take a guy out when he's throwing like that."
Ryan Dempster pitched a scoreless ninth for his 12th consecutive save, and 24th in 29 chances.
Zambrano didn't retire the Astros in order until the seventh, but still outpitched Oswalt (9-8) who had won three of his last four decisions.
Oswalt struck out four, but allowed seven hits, including Nevin's homer in the fourth.
The Astros threatened for the first time in the third inning. Willy Taveras beat out a bunt with one out, extending his career-best hitting streak to 17 games. He went to second on a wild pitch and reached third when Craig Biggio grounded out.
Zambrano walked Lance Berkman, then hit Huff with a fastball in the middle of his back to load the bases. But Zambrano escaped by striking out Morgan Ensberg.
In the fourth, Luke Scott doubled to right-center and Brad Ausmus drew a one-out walk. Oswalt bunted them ahead, but Taveras grounded out.
"We had him on the ropes," Garner said, "but we were never able to get him."
Scott, batting .429 since he was called up from Triple-A Round Rock on July 14, led off the sixth with another double. Zambrano walked Adam Everett, but Ausmus grounded into a double play for the second time and Oswalt grounded out on Zambrano's 98th pitch.
Baker said the 24-year-old Zambrano has only started to show his potential.
"If he cuts those walks down, boy, he could throw a complete game every time out," Baker said. "But he's still learning. Boy, he's going to be something."
Nevin gave Zambrano all the support he needed in the fourth, hitting a 2-0 pitch off the brick facade in left center after Aramis Ramirez singled. It was Nevin's 19th homer of the season.
From there, the Cubs were confident their best pitcher would hold the lead.
"You give him a run or two, you can see him attack the game," Nevin said of Zambrano. "If you're looking for an ace of a staff, he's one of the top guys out there."
Cedeno led off the seventh with a line drive that ricocheted off Oswalt's right hand to shortstop Everett, who got the out. Ausmus and manager Phil Garner walked out to check on Oswalt, but he stayed in the game and struck out Zambrano.
Oswalt left after finishing the inning and Nevin added an RBI single in the eighth off Astros reliever Chad Qualls. The Astros' bullpen came into the game with a 3.11 ERA since the All-Star break, second only to the New York Mets in the NL.
- The Cubs have homered in nine consecutive games, a season high.
- Taveras' hit streak is the longest by an Astros player since Jeff Kent's franchise record 25-game streak in May-June 2004. Taveras has the longest active hit streak in the majors.
- Biggio's first-inning walk was the major league-leading 500th allowed by the Cubs.