If we can make a slight change to your premise, and never have rows in your lookup without prices, e.g...
| inputlookup Price where Price=* | outputlookup Price
Then one way to solve your puzzle would be...
<base search> | lookup Price Description, Vintage OUTPUT Price
| lookup Price Description OUTPUT Price as APrice Vintage as AVintage
| eval APrice = "(".mvindex(mvzip(AVintage,APrice,") "),0), Price=coalesce(Price,APrice)
| fields - APrice,AVintage
What's happening here is that we perform both the exact price lookup and approximate price/vintage lookups, as you have found already. Next we use mvzip to combine the corresponding Vintage and Price pairs for the guide prices (Why it's important that every row in the lookup has a Price, as if a vintage did not, the corresponding lists would not necessarily line up correctly.)... we then use mvindex to select the first one, and an append to finish up the value correctly. Then using coalesce, we're able to pick the exact match price, for those rows with such, but if not present we pick the built guide price.
A variation on this, you could set the maximum number of matches on your lookup to 1, then you only need to use string append to build the guide price, coalesce would then be the same.
... View more