Hola, buen día.
He revisado tu código y encontré lo siguiente.
En la linea de "mas hambre" tenemos el primer error:
...
if %hambre% EQU 20 (goto menosvida)
...
El código EQU significa "igual a", entonces, el hambre va subiendo en múltiplos de 3. Cuando llega a 18 y sube a 21, haciendo que el 20 nunca aparezca, y el comando dice "igual a 20".
Para solucionar esto, cambiemos el EQU por GEQ, que signica "mayor o igual a". Dejándolo así:
...
if %hambre% GEQ 20 (goto menosvida)
...
Aquí le decimos al programa que, cualquier número igual o superior a 20, el condicional se active.
Así, mientras el hambre sube y sube, la vida baja y baja y cuando llegue a 0, dirá que estás morido.
Y el resto del código está bien.
============
@echo off
set vida=30
set hambre=0
:inicio
cls
echo Vida: %vida%
echo Hambre:%hambre%
echo.
timeout /t 2 >nul
goto mashambre
:mashambre
set /a hambre= %hambre% + 3
if %hambre% GEQ 20 (goto menosvida)
goto inicio
:menosvida
set /a vida= %vida% - 2
if %vida% EQU 0 goto dead
goto inicio
:dead
echo.
echo.
echo Muerto.
pause.
exit