The 21-year-old spent last season on loan at Real Sociedad, where he made 24 appearances in all competitions, and is one of seven players offloaded by Zinedine Zidane since the end of the 2018-19 campaign.
Theo had been on Atletico Madrid's books as a youngster before swapping for city rivals Real in 2017 for €24m (£21.5m/$27m). However, just two years later, he's been deemed surplus to requirements at the Santiago Bernabeu.
Milan have acquired the defender to replace Ricardo Rodriguez, and the signing became a formality following his medical earlier in the month. The Italian giants have committed to paying the fee in 2020 following a year-long loan in 2019-20.
Theo has been handed a five-year contract by Paolo Maldini, who was promoted to technical director at the Rossoneri and headhunted the former France youth international.
Initial reports said Real has hoped to let him move to San Siro on loan with an option to buy, but Milan have held out for a permanent deal.
Meanwhile, Theo's transfer means Madrid have broken the €100m mark for off-season sales following the previous exits of Marcos Llorente (Atletico Madrid), Raul de Tomas (Benfica), Mateo Kovacic (Chelsea) and Alvaro Tejero (Eibar).
Gareth Bale and Isco are among the higher profile players also linked with an exit from a squad looking to perform far better following a 2019 without major silverware.
Ferland Mendy, Rodrygo, Eden Hazard, Eder Militao and Luka Jovic have taken their spending to in excess of €300m, with Neymar, Paul Pogba and Christian Eriksen all reported to be additional transfer targets.