Depois de ler a documentação do \% V mais de perto, posso responder a pergunta:
To make sure the whole pattern is inside the Visual area put \%V at the start and end of the pattern
Então meu mapeamento precisava ser alterado para
vnoremap <silent> _p <Esc>'>a</p><Esc>'<i<p><Esc>:'<,'>s/\%V\n\{2,}\%V/<\/p>\r\r<p>/ge<CR>:nohl<CR>
Peço desculpas por pesquisas impróprias antes de postar minha pergunta.