Zinedine Zidane's side were missing seven players through injury and illness, including the indispensable trio of Sergio Ramos, Karim Benzema and Casemiro, but the champions went ahead in the second minute with a diving header from Mariano Diaz.
Villarreal forward Gerard Moreno levelled from the spot in the 76th minute after substitute Samuel Chukwueze had been felled by Madrid keeper Thibaut Courtois, who also let in three penalties in the 4-1 defeat at Valencia two weeks ago.
Real are fourth in the standings on 17 points, while Villarreal are second on 19. Real Sociedad are top with 20 points.
"We had some very important players missing and it's not easy for any club to deal with the difficulties we are facing at the moment," said Madrid defender Nacho.
"But we showed character and played well, even though we're not happy that we couldn't get the three points."
Real's injury crisis led to Dominican forward Mariano making his first start since May 2019, when he scored twice in a 3-2 win over Villarreal, and he wasted little time in making his mark.
Moreno was pleased with his side's reaction after a poor first half.
"We felt that we could have gone on to get the win, we had a few chances but the point is a good one considering how we started the game," he said.
"We failed to keep possession for long in the first half and struggled to make chances. But in the second half we changed that, we showed we're a team that loves to have the ball and we were the better side and should have won the game."