First of all, it's easy to check the numeric solution doesn't match the analytic one:
tmax = 1;
A[y_?NumericQ, r_] := NIntegrate[y, {s, 0, r}];
sol = NDSolveValue[{D[w[t, r], t] == D[q[t, r], r], D[q[t, r], t] == A[w[t, r], r],
w[t, 0] == Cosh[t], q[t, 0] == 0, w[0, r] == Cosh[r], q[0, r] == 0}, {w, q}, {t, 0,
tmax}, {r, 0, 1}];
solw = Cosh@# Cosh@#2 &; solq = Sinh@# Sinh@#2 &;
With[{t = 1/2},
Table[Plot[{sol[[i]][t, r], {solw, solq}[[i]][t, r]}, {r, 0, 1}], {i, {1,
2}}]] // GraphicsRow

You may be thinking that the distinction is just caused by numeric error, and the accuracy can be improved by proper option adjustment etc., but it's not true. Your solution is just wrong, because
A[y_?NumericQ, r_] := NIntegrate[y, {s, 0, r}];
isn't a correct definition for $A=\int^r_0y(s)ds$.
Why is it incorrect? That's because $y$ is a function in the definition of $A$, while y_?NumericQ only allows numeric number to be the first argument of A. For example:
yfunc[r_] = Sin[r];
rvalue = 2;
NIntegrate[yfunc[s], {s, 0, rvalue}]
(* 1.41615 *)
A[yfunc[s], r]
(* A[Sin[s], r] *)
"But NDSolve is very clever, perhaps it will do something wonderful under the hood!" Sadly, it doesn't. By checking the output of NDSolve`ProcessEquations, we'll find NDSolve has just treated A as a blackbox function whose first argument is a constant, which is quite reasonable in my view:
{state} = NDSolve`ProcessEquations[{D[w[t, r], t] == D[q[t, r], r],
D[q[t, r], t] == A[w[t, r], r], w[t, 0] == Cosh[t],
q[t, 0] == 0, w[0, r] == Cosh[r], q[0, r] == 0}, {w, q}, {t, 0, tmax}, {r, 0, 1}];
state["NumericalFunction"]["FunctionExpression"] /.
Thread[Flatten[state["WorkingVariables"]] -> Flatten[state["Variables"]]]

"OK, then how to fix?" One possible solution is to avoid the integral and discretize the system at least in $r$ direction all by ourselves. I've already collected several related posts here under your last question.
Note: The following solution no longer works in and after v11.3 because NDSolve`StateData[…] has become an atom since then. A question aiming at finding a workaround has been started.
Another solution, which is more advanced and probably more limited thus I don't recommend, is to modify the NDSolve`StateData:
fakefunc[r_?NumericQ] = 0;
{state} = NDSolve`ProcessEquations[{D[w[t, r], t] == D[q[t, r], r],
D[q[t, r], t] == fakefunc[r], w[t, 0] == Cosh[t],
q[t, 0] == 0, w[0, r] == Cosh[r], q[0, r] == 0}, {w, q}, {t, 0, tmax}, {r, 0, 1}];
state["NumericalFunction"]["FunctionExpression"]

The fakefunc is to force NDSolve`ProcessEquations to generate a MapThread[…] so we can modify StateData later in a easier way.
Next we need to define $A$ correctly. Notice the following is not the fastest definition, but it's simple:
Clear@A; A[y_List, r_] :=
With[{func = ListInterpolation[y, {{0, 1}}]},
NIntegrate[func@s, {s, 0, r}, Method -> {Automatic, SymbolicProcessing -> 0}]];
Finally, replace the MapThread[…] with desired $A$ and solve:
rule = HoldPattern@MapThread[Function[{r}, fakefunc[r]], {r}, 1] :> (A[w, #] & /@ r)
newstate = state /. rule;
NDSolve`Iterate[newstate, tmax]
soltest = {w, q} /. NDSolve`ProcessSolutions@newstate
This time the solution is correct:
With[{t = 1/2},
Table[Plot[{soltest[[i]][t, r], {solw, solq}[[i]][t, r]}, {r, 0, 1},
PlotStyle -> {Automatic, {Thick, Dashed}}], {i, {1, 2}}]] // GraphicsRow
