There are a few issues with this code.
First of couse is the formatting. Please do not post code that is all run together. It's impossible to read. Use the "Code Sample Block" tool to give it proper formatting.
Next, there's no good reason to make the variables constants. Because this code is in a calculation script, it already has block scope. And if the data table was moved to a document script, it would have document scope. Although this is not an error, overuse of constants gets in the way of re-running the code for debug purposes.
Next, you've reused the same variable names (this is the source of your error),
and you've used confusing names. When passing predicate functions, it's best to use a consistent naming convention for the predicate variable. It reduces confusion and conflicts.
It's also a good idea to use type prefixes on your variable to reduce confusion and conflicts.
Also, the code does not handle the No Match case, which will cause the 2nd to last line to throw an exception.
Here's a simple re-write that takes care of these issues:
Note that since the "some" function is used to iterate through the table that it could also be used to detect matched result. However, the initial value of 0 for the price does the same thing by default, just as long as none of the prices are 0.
var nWidth = (Math.ceil(this.getField("Width").value/1000)*1000);
var nProjection = this.getField("projection").value;
var table = [
{ width: 2000, projections: [{ size: 200, price: 499}, { size: 400, price: 1499}]},
{ width: 3000, projections: [{ size: 200, price: 999}, { size: 400, price: 1999}]},
];
// return the relevant row based on the awning width
var nPrice = 0;
table.some(function(oItem){ return (oItem.width == nWidth) && oItem.projections.some(function(oProj){return (oProj.size == nProjection) && (nPrice = oProj.price);});})
event.value = nPrice;