Update: Making the two methods in the original answer into functions:
The first method:
ClearAll[aP]
aP = Module[{dt = #, ao = #2, dim = Dimensions[Transpose @ #] + #2,
dt2 = ArrayPad[#, {{0, #2[[2]]}, {#2[[1]], 0}}], tcks, inset},
tcks = {Table[{i + .5, i + 1}, {i, ao[[1]], dim[[1]] - 1}],
Table[{i + .5, dim[[2]] - i}, {i, ao[[2]], dim[[2]] - 1}]};
inset = ArrayPlot[dt2, AxesOrigin -> ao, Ticks -> tcks, ##3,
Axes -> True, Frame -> False, Mesh -> All,
AxesStyle -> Directive[Thick, Red],
TicksStyle -> Directive[Thick, Red, FontColor -> Black]];
ArrayPlot[ConstantArray[0, Reverse@dim],
Epilog -> Inset[inset, {0, 0}, {0, 0}, Scaled[1]], ##3,
FrameTicks -> ({{#2, #2}, {#, #}} & @@ Range@dim)]] &;
Examples:
SeedRandom[1]
data = RandomReal[1, {7, 9}];
Row[Labeled[Panel@aP[data, #, ImageSize -> 1 -> 25],
Row[{"AxesOrigin -> ", #}], Top] & /@ {{2, 2}, {1, 3}, {3, 2}}, Spacer[10]]

The second method:
ClearAll[epilogF]
epilogF[data_, ao_] := Module[{dim = Dimensions[Transpose @ data] + ao},
{Table[{Text[i + 1, # - {0, .25}], Red, Thick,
Line[{Offset[{0, 3}, #], #}]} & @ {i + .5, ao[[2]]},
{i, ao[[1]], dim[[1]] - 1}],
Table[{Text[dim[[2]] - i, # - {.25, 0}], Red, Thick,
Line[{Offset[{3, 0}, #], #}]} & @ {ao[[1]], i + .5},
{i, ao[[2]], dim[[2]] - 1}]}];
Examples:
SeedRandom[1]
data = RandomReal[1, {9, 7}];
Row[Labeled[Panel @ ArrayPlot[ArrayPad[data, {{0, #[[2]]}, {#[[1]], 0}}],
ImageSize -> 1 -> 25,
Mesh -> All,
GridLines -> (List /@ #),
GridLinesStyle -> Directive[Red, Thick],
Method -> {"GridLinesInFront" -> True},
Frame -> True,
FrameTicks -> Automatic,
Epilog -> epilogF[data, #]],
Row[{"AxesOrigin -> ", #}], Top] & /@ {{2, 2}, {1, 3}, {3, 2}},
Spacer[10]]

Original answer:
SeedRandom[1]
data = RandomReal[1, {8, 8}];
ao = {2, 2};
dims = Dimensions[Transpose @ data] + ao;
ticks = {Table[{i + .5, i + 1}, {i, ao[[1]], dims[[1]]}],
Table[{i + .5, dims[[2]] - i}, {i, ao[[2]], dims[[2]]}]};
ap = ArrayPlot[ArrayPad[data, {{0, ao[[2]]}, {ao[[1]], 0}}],
AxesOrigin -> ao, Axes -> True, Frame -> False, Mesh -> All,
AxesStyle -> Directive[Thick, Red],
TicksStyle -> Directive[Thick, Red, FontColor -> Black],
Ticks -> ticks]
You can use Inset[ap, {0, 0}, {0, 0}, Scaled[1]]
as Epilog
in an empty ArrayPlot
to get the desired result:
ArrayPlot[ConstantArray[0, Reverse @ dims],
Epilog -> Inset[ap, {0, 0}, {0, 0}, Scaled[1]],
FrameTicks -> Automatic]

An alternative approach: add ticks and tick labels as Epilog
directly:
epilog = Join[
Table[{Text[i + 1, #], Red, Thick,
Line[{Offset[{0, 3}, # + {0, .5}], # + {0, .5}}]} & @
{i + .5, ao[[2]] - .5}, {i, ao[[1]], dims[[1]] - 1}],
Table[{Text[dims[[2]] - i, #], Red, Thick,
Line[{Offset[{3, 0}, # + {.25, 0}], # + {.25, 0}}]} &@
{ao[[1]] - .25, i + .5}, {i, ao[[2]], dims[[2]] - 1}]];
ArrayPlot[ArrayPad[data, {{0, ao[[2]]}, {ao[[1]], 0}}],
Mesh -> All,
GridLines -> (List /@ ao),
GridLinesStyle -> Directive[Red, Thick],
Method -> {"GridLinesInFront" -> True},
Frame -> True,
FrameTicks -> Automatic,
Epilog -> epilog]
