Idea:
What if you summon an armor stand at the player and run this every tick:
(Commands for 1.16)
/execute as @e[type=armor_stand,tag=Spinning] at @s run tp @s ~ ~ ~ ~25 ~
Then use your existing command to teleport the villagers but use it on the armor stand
/execute at @e[type=player,nbt={Inventory:[{Slot:102b,tag:{display:{Name:"{\"text\":\"Suit of Villagers\",\"color\":\"gold\",\"bold\":\"true\"}"}}}]}] as @e[type=armor_stand,tag=Spinning] run tp @e[type=villager,nbt={CustomName:"{\"text\":\"Bobby\"}"}] ^ ^ ^2
This works because you said the villagers rotate when you look meaning if I set them to a rotating entity they will rotate with the entity.
This is untested but is the best thing I could think of :)
Edit: Here are the commands you will need:
Run in a Repeating, Always Active, Command Block followed by Chain, Always Active, Command Blocks: (Order Counts, Top to Bottom)
/execute as @e[tag=!Checked,type=player,nbt={Inventory:[{Slot:102b,tag:{display:{Name:"{\"text\":\"Suit of Villagers\",\"color\":\"gold\",\"bold\":\"true\"}"}}}]}] at @s run summon armor_stand ~ ~ ~ {Invisible:1b,Tags:["Spinning"]}
/execute as @e[tag=!Checked,type=player,nbt={Inventory:[{Slot:102b,tag:{display:{Name:"{\"text\":\"Suit of Villagers\",\"color\":\"gold\",\"bold\":\"true\"}"}}}]}] at @s run summon villager ~ ~ ~ {NoAi:1b,Tags:["Spin"],CustomName:'{"text":"Bobby"}'}
/execute as @e[tag=!Checked,type=player,nbt={Inventory:[{Slot:102b,tag:{display:{Name:"{\"text\":\"Suit of Villagers\",\"color\":\"gold\",\"bold\":\"true\"}"}}}]}] at @s run summon villager ~ ~ ~ {NoAi:1b,Tags:["Spin1"],CustomName:'{"text":"Bobby"}'}
/execute as @e[tag=!Checked,type=player,nbt={Inventory:[{Slot:102b,tag:{display:{Name:"{\"text\":\"Suit of Villagers\",\"color\":\"gold\",\"bold\":\"true\"}"}}}]}] at @s run summon villager ~ ~ ~ {NoAi:1b,Tags:["Spin2"],CustomName:'{"text":"Bobby"}'}
/execute as @e[tag=!Checked,type=player,nbt={Inventory:[{Slot:102b,tag:{display:{Name:"{\"text\":\"Suit of Villagers\",\"color\":\"gold\",\"bold\":\"true\"}"}}}]}] at @s run summon villager ~ ~ ~ {NoAi:1b,Tags:["Spin3"],CustomName:'{"text":"Bobby"}'}
/execute as @e[tag=!Checked,type=player,nbt={Inventory:[{Slot:102b,tag:{display:{Name:"{\"text\":\"Suit of Villagers\",\"color\":\"gold\",\"bold\":\"true\"}"}}}]}] at @s run tag @s add Checked
/execute as @e[tag=Checked,type=player,nbt={Inventory:[{Slot:102b,id:"minecraft:air"}]}] at @s run tag @s remove Checked
/execute as @e[tag=!Checked,type=player,nbt={Inventory:[{Slot:102b,tag:{display:{Name:"{\"text\":\"Suit of Villagers\",\"color\":\"gold\",\"bold\":\"true\"}"}}}]}] at @s run tag @s add Checked
/execute as @e[tag=Checked,type=player,nbt={Inventory:[{Slot:102b,tag:{display:{Name:"{\"text\":\"Suit of Villagers\",\"color\":\"gold\",\"bold\":\"true\"}"}}}]}] at @s run tp @e[distance=5,tag=Spinning] ~ ~ ~
/execute as @e[tag=Spinning] at @s run tp @s ~ ~ ~ ~15 ~
/execute as @e[tag=Spinning] at @s run tp @e[distance=..5,tag=Spin] ^ ^ ^2
/execute as @e[tag=Spinning] at @s run tp @e[distance=..5,tag=Spin1] ^ ^ ^-2
/execute as @e[tag=Spinning] at @s run tp @e[distance=..5,tag=Spin2] ^2 ^ ^
/execute as @e[tag=Spinning] at @s run tp @e[distance=..5,tag=Spin3] ^-2 ^ ^
/execute as @e[tag=Spin] at @s rotated as @e[distance=..5,tag=Spinning] run teleport @s ~ ~ ~ ~ ~
/execute as @e[tag=Spin2] at @s rotated as @e[distance=..5,tag=Spinning] run teleport @s ~ ~ ~ ~-90 ~
/execute as @e[tag=Spin1] at @s rotated as @e[distance=..5,tag=Spinning] run teleport @s ~ ~ ~ ~180 ~
/execute as @e[tag=Spin3] at @s rotated as @e[distance=..5,tag=Spinning] run teleport @s ~ ~ ~ ~90 ~
/execute as @e[tag=Spinning] at @s unless entity @e[type=player,tag=Checked,distance=..5] run kill @e[tag=Spinning]
/execute as @e[tag=Spinning] at @s unless entity @e[type=player,tag=Checked,distance=..5] run kill @e[tag=Spin,distance=..5]
/execute as @e[tag=Spinning] at @s unless entity @e[type=player,tag=Checked,distance=..5] run kill @e[tag=Spin1,distance=..5]
/execute as @e[tag=Spinning] at @s unless entity @e[type=player,tag=Checked,distance=..5] run kill @e[tag=Spin2,distance=..5]
/execute as @e[tag=Spinning] at @s unless entity @e[type=player,tag=Checked,distance=..5] run kill @e[tag=Spin3,distance=..5]
I am having problems summoning the entities, but when I tested the spinning it worked. (I edited it so I think it works now, new edits untested)
On the command:
/execute as @e[tag=Spinning] at @s run tp @s ~ ~ ~ ~15 ~
You can adjust the 15 to make it go faster or slower. A higher number means faster, a lower one means slower.
Technical Stuff:
This works using an armor stand that is constantly rotated. I execute from that armor stand and teleport the villagers to those relative coordinates. To make them face away from the player I made their facing coords relative to the armor stand that is teleported to the player.
Why I made this:
I was working on a similar issue but instead of villagers, it was invisible charged creepers for a cool power effect.
Flaws: When two players get too close to each other it breaks. Takes lots of command blocks. Slight lag if you are playing on a potato.