You could try changing the syntax to, say,
evalf(Int((r,a)->P(r)*a, [0..1, 0..1])):
evalf(Int('P'(r)*a, [r=0..1, a=0..1]));
Do you see that when you changed from single-argument to two-argument you also changed the calling sequence? You changed it to an invalid mashup of operator and expression form.
Alternatively, you could use P(r)*a as the expression, but you'd first have to modify the defn of P so that it returned unevaluated if passed symbol r rather than a number. One of your attempts this way encountered what's known as premature evaluation, where P received nonnumeric r and was not set up to deal with that. For example,
P := proc(r)
if not r::numeric then return 'procname'(r); end if;
...proceed as usual...
I prefer this last approach.
But you cannot sensibly use P*a as the integrand, where P is a procedure and a is an expression in one of more of the variables of integration.
If you upload your actual data file as an attachment in a Comment on the Question then I can easily show you all three methods at work.
As a side note, procedure P could be far more efficient if you wrote it to not have to re-form the data every time it gets called. I'd prefer to have the data, to check, before re-writing it all. You could substitute the actual data in lieu of a dummy name in the proc, or you could do it like, say,
where use is again made of uneval quotes.