Cuando "sueltas" la imagen lo que estas haciendo es colocar un TImage encima de otro, así que el espacio que ocupaba queda vació. Por eso cuando intentas mover una imagen al sitio que quedo vacío no funciona, porque el método que utilizas solo mueve una Timage sobre otro, no a un sitio vacío.
Una solución podrá ser intercambiar los sitios de las dos imágenes, algo así:
Código Delphi
[-]
procedure Tfrm.ImageDragDrop(Sender, Source: TObject; X, Y: Integer);
var
i,j: Integer;
begin
if (Source is TImage) then
begin
i := TImage(Source).Left;
j := TImage(Source).Top;
TImage(Source).Left := TImage(Sender).Left;
TImage(Source).Top := TImage(Sender).Top;
TImage(Sender).Left := i;
TImage(Sender).Top := j;
TImage(Sender).Picture.Graphic := nil;
end;
end;