2) No downside I can think of, other than what you mentioned, and possibly being more work than the getheadingangle method
As for restoring the values, what I'm thinking you'd do is something like this:
upon entering dialog with vendor:
if rVendor == vendor1
set meatModifier to 2
set ammomodifier to 0.5
etc...
endif
meatValues = meatValues * meatModifier ; step through the various form lists multiplying the individual item values by the modifiers
ammoValues = ammoValues * ammoModifier
etc...
Upon leaving dialog with vendor:
meatValues = meatValues / meatModifier ; step through the form lists dividing by the modifiers
ammoValues = ammoValues / ammoModifier
etc...
Since the modifier values are known, you can return the item values to their original values by dividing by them. There'll be a little bit of rounding error due to floating point math, but not enough to mess anything up, plus any changes to base objects made via these NVSE functions are "forgotten" the next time you load a game, so everything gets put back to normal periodically anyway. Some RestoreOriginalValue functions would be nice though.