O literal 127 denota um valor do tipo int. O mesmo acontece com o literal 1. A soma desses dois é o número inteiro 128. O problema, no segundo caso, é que você está atribuindo isso a uma variável do tipo byte. Não tem nada a ver com o valor real das expressões. Tem a ver com Java que não suporta coerções (*). Você precisa adicionar um typecast
byte b = (byte)(127 + 1);
e depois compila.
(*) pelo menos não do tipo String-to-integer, float-to-Time, ... Java suporta coerções se elas são, de certo modo, sem perda (Java chama isso de "ampliação").
E não, a palavra "coerção" não precisava ser corrigida. Foi escolhido de maneira muito deliberada e correta. Da fonte mais próxima em mão (Wikipedia): "Na maioria dos idiomas, a palavra coerção é usada para denotar uma conversão implícita , durante a compilação ou durante o tempo de execução". e "Na ciência da computação, conversão de tipos, conversão de tipos e coerção são formas diferentes de, implícita ou explicitamente, alterar uma entidade de um tipo de dados para outro".
byte
tipo de dados é tão doloroso ?!