The Brazilian struck twice to give his side a narrow victory and ensure they remain top of La Liga
The Brazilian forward – who scored a hat-trick in Barca's 6-1 thrashing of Celtic in the Champions League on Wednesday – starred again for the Catalan giants, who moved three points clear of second-placed Atletico Madrid with victory.
Neymar got the home side going with a 30th minute penalty, converting successfully after a harsh handball decision against Mario.
Villarreal enjoyed good spells and levelled three minutes after the break thanks to captain Mateo Musacchio's header.
Neymar had the last laugh, though, with the 21-year-old tapping in from close range after excellent build-up work by Cesc Fabregas and Alexis Sanchez with 22 minutes to play.
Despite missing Lionel Messi, Victor Valdes and Dani Alves due to injury, Barcelona still fielded a strong side as head coach Gerardo Martino made five changes with Fabregas and Andres Iniesta among them.
Former Blaugrana forward Giovani dos Santos started against his old club, but Villarreal were without key midfield pair Cani and Bruno, missing through injury and suspension respectively.
Barca started brightly and almost took the lead in the sixth minute as Alex Song fired a half-volley against the inside of the post from close range.
Giovani excited with two smart dribbles, but his runs eventually amounted to nothing, before the hosts took the lead in fortunate circumstances on the half-hour mark.
Mario was adjudged to have handled the ball inside his penalty area after Jordi Alba hit a ball straight at him from only a few yards away.
Referee Ignacio Iglesias pointed to the spot and Neymar calmly slotted past Villarreal goalkeeper Sergio Asenjo and into the bottom-left corner.
Asenjo was at his best six minutes before the break, though, saving well to deny Alexis and keep the margin to one goal at half-time.
And Villarreal levelled three minutes into the second half, as skipper Musacchio lost Marc Bartra and powered in a thumping header from Manuel Trigueros' corner.
Barcelona goalkeeper Jose Manuel Pinto got a hand to the effort but could not keep it out and Giovani shot just wide as the visitors pressed for a second.
The Catalan giants were patient in response and it ultimately paid dividends, as five minutes after Asenjo charged off his line to deny Fabregas, Neymar scored again.
A superb Fabregas ball was chested down by Alexis and instead of shooting – which he could have easily done – the Chilean drew the goalkeeper before squaring for Neymar to net.
Iniesta's volley forced a good late save from Asenjo, but two goals were enough for Barcelona, who extended their home winning run to 10 matches.