gather creates a copy of the array in main memory. Clearing a gpuArray variable will release its memory. So if you replace a gpuArray variable x with gather(x) then that will clear the gpuArray and release the memory. In other words
x = gather(x);
releases memory, but
y = gather(x);
does not, because x is still a gpuArray.
Hope that helps.
Note that MATLAB pools GPU memory, so memory available to MATLAB may continue to appear used in the Task Manager. You can get rid of this behaviour by setting the gpuDevice CachePolicy property to "minimum".