The Italian midfielder gave Juve a deserved lead three minutes from time.
Milan then had Kevin-Prince Boateng sent off for a second bookable offence and Marchisio notched his second in injury time.
The result lifts unbeaten Juve to the top of the standings, level on 11 points with Udinese.
Milan, meanwhile, have just five points from five games.
Milan striker Zlatan Ibrahimovic missed the last three league games through injury but returned to the line-up to face his former club.
The hosts dominated the opening stages and former AC Milan midfielder Andrea Pirlo was first to test Christian Abbiati with a 30-yard drive towards the near post which the goalkeeper saved.
Juve almost went in front in the 37th minute.
Mirko Vucinic's right-footed shot from the edge of the area struck the crossbar with Abbiati well beaten.
With Milan opting for a defensive approach, the home side continued to press forward and came close to scoring just before the break as Vucinic's powerful drive went just wide of the far post.
Juve picked up where they left off after the re-start with Abbiati forced to palm Leonardo Bonucci's close-range effort over the bar.
At the other end, Juventus goalkeeper Gianluigi Buffon turned Boateng's right-footed strike round the post for a corner.
Shortly after the hour mark, Milan wasted a good chance when Clarence Seedorf fed Ibrahimovic but the Swede was unable to control the ball inside the area and the opportunity went begging.
Juve finally broke the deadlock in the 87th minute when Daniele Bonera's poor clearance fell to Marchisio, who fired past Abbiati.
Seconds later, Boateng was handed his marching orders after brushing Giorgio Chiellini's face with his arm as he ran past.
Juve got their second when Abbiati allowed Marchisio's volley from outside the area to go in between his legs.