The problem comes from what you're 'feeding' to Vectorize.
Vectorize wants a function as its argument. cubeAndAdd is a function, but cubeAndAdd(x,y) is a function call.
To make your outer loop syntactically correct, you should use Vectorize to create the vectorized function, and then call that new function:
outer(-1:1,-1:1,function(x,y) Vectorize(cubeAndAdd)(x,y))
Here, Vectorize(cubeAndAdd) is the function, and you're calling it using (x,y) as arguments: so Vectorize(cubeAndAdd)(x,y)
(Although the suggestion to just remove the entire anonymous function(x,y) from the outer loop works here (and makes the one-liner shorter), it's often a good idea to explicitly 'feed' the arguments to the function, as you are doing, since this allows one to use functions that expect additional arguments).
outer(-1:1,-1:1,Vectorize(cubeAndAdd))? Since you already define x and y, is there a need to redefine a lambda?function(x,y)again which introduces another lambda and hence it is unclear what to match to the function. If you really want to be explicit, then:outer(-1:1,-1:1,Vectorize(function(x,y) cubeAndAdd(x,y)))