**Updated** to handle `$` showing from using module variable.
Add `TrackedSymbols :> {c}` and add `Module`
ClearAll[x,y,c];
y[x_,c_]:=-x^2+c
Manipulate[
Module[{ymax,x},
ymax=FindMaximum[{y[x,c],-1<=x<=1},x];
Grid[
{
{str[ymax]},
{Plot[y[x,c],{x,-1,1}]}
}
]
]
,
{c,-0.5,0.5},
TrackedSymbols:>{c}
]
(*this function to handle $ in local variable names *)
str[expr_]:=Module[{},
StringReplace[ToString[expr,
FormatType->TraditionalForm],
c:LetterCharacter~~"$"~~DigitCharacter..:>c]];
Now

Manipulate by default will track all symbols that shows inside it. So when you typed `ymax`, frontend tracked this symbols and Manipulate went and re-evaulated its expression again, and that is why you got `0.5`.
As a rule of thumb, I always use `TrackedSymbols`. This keep things safe. Also use a `Module` inside `Manipulate` to add internal context. Like this:
So rules of thumbs
1. Use Module inside Manipulate to hide any non-control variables used inside Manipulate. (in your example, these would be `x` and `ymax`.
2. Use `TrackedSymbols` to explicitly list the symbols being tracked. In your case `c`.
This should eliminate most of the problems.
ps. the `$` showing up attached to symbols, when printing/displaying expressions from inside module is common in Mathematica. See [print-expressions-using-local-variables-in-module-without-dollar-sign-is-that-p][1]
[1]: https://mathematica.stackexchange.com/questions/137036/print-expressions-using-local-variables-in-module-without-dollar-sign-is-that-p