Don't go changing loop iterators inside the loop unless you want to cause problems. It's entirely unnecessary here anyway. If you state that:
for col = 1:Nx
then col will never be less than 1 or greater than Nx. You don't need to clamp them. So we can get rid of that part.
Nx = 9;
Ny = 9;
domain=zeros(Nx,Ny);
cons1=epsilon_0/(epsilon_0+epsilon_r);
cons2=epsilon_r/(epsilon_0+epsilon_r);
for row = 1:Ny
for col = 1:Nx
v1 = domain(row, col+1);
v2 = domain(row-1, col);
v3 = domain(row, col-1);
v4 = domain(row+1, col);
if row == (1/3)*(Ny+1) || row ==(2\3)*(Ny)
domain(row,col) = cons1*v1+cons2*v3+(1/4)*(v2+v4);
elseif row == 1
domain(0, col)=(1/4)*(v1+v3+2*v4);
elseif col == 1
domain(0, col)=(1/4)*(2*v1+v2+v4);
else
domain(row,col) = (1/4)*(v1+v2+v3+v4)
end
end
end
Of course, it still won't run, because that wasn't really the problem. The line you mentioned is the problem.
v2 = domain(row-1, col);
On the first pass, row and col are 1, so it's looking for domain(0,1), which isn't a valid location in an array. Similarly, there are lines like these that use zero indices:
domain(0, col)=(1/4)*(v1+v3+2*v4);
...
domain(0, col)=(1/4)*(2*v1+v2+v4);
Since I don't really know what this code is supposed to be doing, I can't say how to fix it. You might be able to offset the starting index in the loop definition. You might be able to pad the array. You might be able to limit the indexes when using them:
v2 = domain(max(row-1,1), col);
The propriety of any of these options depends on what is actually supposed to be done.