I'm not entirely sure what's wrong with the regex, though filbranden has some thoughts in the comments.
To solve the issue, though, I would do something a bit different: :global/<div>/normal! dat (delete the tag on the lines with an opening div tag).
From :h /^
At beginning of pattern or after "|", "(", "%(" or "\n": matches start-of-line; at other positions, matches literal '^'.
Hence, as @ChristianBrabandt noted in comments, you must write your pattern as :'<,'>s/^\%V$//n, or alternatively, :'<,'>s/\%V\_^$//n