There isn't really a tool made for this within IPT or base MATLAB. You can certainly roll your own, or you could write a small function and use nlfilter().
A = imread('cameraman.tif');
B = nlfilter(A,fsize,@getpix);
function outpix = getpix(sample)
outpix = sample(randi([1 numel(sample)],1));
If you want to apply this method to RGB images, you'll have to jump through some extra hoops. You can build an index array and pass it through nlfilter() and then use that to displace the image.
Alternatively, you can do it with direct indexing:
A = imread('peppers.png');
A = padarray(A,fsize,0,'both');
[xx yy] = meshgrid((1:s0(2))+fsize(2),(1:s0(1))+fsize(1));
yy = yy + randi([-1 1]*d(1),s0(1:2));
xx = xx + randi([-1 1]*d(2),s0(1:2));
idx = sub2ind(size(A),yy,xx);
B(:,:,c) = thischan(idx);
Although it's not strictly the same as what you mention, MIMT imnoiseFB() has a couple additional modes, including spatial noise modes. A = imread('peppers.png');
B = imnoiseFB(A,'spatial',[5 10]);
These modes don't use uniform sampling from a fixed window. From the synopsis:
imnoiseFB(INPICT,'spatial',{VARIANCE})
Displaces pixels by a random vector. Displacement magnitude is zero-mean gaussian noise with
VARIANCE specified per axis (or as scalar with implicit expansion) (default [1 1]). This is similar
to GIMP's 'spread' plugin, and more remotely, the old 'pick' plugin. Entire pixels are displaced.
imnoiseFB(INPICT,'spatialind',{VARIANCE})
Identical to 'spatial', but all pages of the array are displaced with unique displacement maps.