Porque en UNIX / POSIX, el código de salida de un programa se define como un valor de 8 bits sin signo. La conversión de -1 a 8 bits sin signo da 255.
Editar para agregar:
Para dar más detalles: la familia wait * () de llamadas al sistema en UNIX codifica el resultado de un proceso en un solo entero de 32 bits. Los 32 bits de ese resultado se dividen aún más para proporcionar información como si el proceso descargó el núcleo, salió debido a una señal (y cuál), etc. De esos 32 bits, solo 8 están reservados para el código de salida del proceso y esos se interpretan como un valor sin signo.
El modelo fork / exec / wait de UNIX / POSIX es una de sus características más antiguas y más profundamente integradas; Si estuviera diseñando un nuevo sistema operativo hoy, podría hacer algo diferente (al menos usar 64 bits :-)).
Por otro lado, en términos prácticos, ¿es realmente útil tener> 255 códigos de salida? Lo dudo. Si realmente quisiera algo más poderoso, le sugiero que cambie a una "cadena de salida", en lugar de un código de salida numérico con un rango más amplio.