Looks like when the line is normally written (and yes for existing lines where a field value is changed just like you noticed), the regular non-script Write function runs (and coincidentally checks if a PreWrite or PostWrite scripts needs to also run), there is in fact a non-script CPV done on PriceLevel when the current Price Level on the line doesn't match the Customer Price Level and the order was not created with RMA. It's part of a ValidatePriceLevel function in SO_CommonEntryDetail which means same thing occurs in Invoice Data Entry. In short it re-runs the Calculate Price routine if the conditions fit (below) and I presume that does the internal SetValue to PriceLevel which is double-firing your CPV script.
As far as how to detect it, I don't see any object property being set that you can check for. I like Mr Speck 2's suggestions to SetStorageVar in the PreVal and check for it in PostVal. Alternately you can extend his cOldVal$ check further to match what the code is checking:
sOldPriceLevel = """" : nInValidateAll = 0 : nCreateFromRMA = 0
sOldPriceLevel = oScript.Evaluate(""cOldVal$"") 'original Pricelevel
nInvalidateAll = oScript.Evaluate(""cInvalidateAll"") 'internal Validate All flag
nCreateFromRMA = oScript.Evaluate(""CreateFromRMA"") 'created from RMA or not
IF sOldPriceLevel <> value AND nInvalidateAll = 0 AND nCreateFromRMA = 0 Then
' Put code here to handle if there is a change.