Creo que no he comprendido bien lo que estás explicando, porque no veo fallo alguno. Vamos por partes:
unsigned short pepe=(unsigned short)-1;
int manolo=(int) pepe;
dices que el valor que coge "manolo" es 65535, y dices que eso es incorrecto si no te he entendido mal (que no estoy seguro), pero yo diría que es correcto.
Primero le dices que convierta -1 a unsigned short. Como eso no se puede hacer, pues lo deja tal cual, al valor 65535.
Luego intentas convertir pepe que es una variable unsigned con valor 65535 (y repito, valor 65535 y no -1) a un entero de 32 bits. Como en el entero de 32 bits el valor 65535 cabe perfectamente, pues ese es el valor que la variable adquiere. Intenta verlo de otra forma, si pones este código:
unsigned short pepe = 65535;
int manolo = (int) pepe;
¿Qué valor debería coger la variable manolo, -1 ó 65535?. Debería coger 65535.
Para poder utilizar una variable como con signo o sin signo indistintamente, lo mejor es utilizar una unión:
typedef union
{
short s;
unsigned short u;
} Conversion;
unsigned short pepe = -1;
Conversion manolo;
manolo.u = pepe;
// manolo.u vale 65535
// manolo.s vale -1
Además los castings no es necesario ponerlos cuando la variable no va a ser truncada. Pasar un unsigned short a un int no trunca variables, así que no es necesario ponerlo. En cambio si quieres pasar de un int a un short, ahí sí que hay que poner el casting, para avisar al compilador de que realmente lo estás haciendo aposta y eres consciente de que se está truncando el tipo.
En esta línea, la variable toma el valor -1:
int manolo=(int)(short) pepe;
pero la razón es la misma de antes: pepe tiene el valor 65535, y le dices que lo convierta a short. Como ese número no cabe en un short, el compilador lo deja tal cual, con lo que tenemos un short de valor -1. Luego le dices que convierta el short de valor -1 a int. El compilador no tiene problemas para hacer eso y así lo hace.
Otra cosa distinta es que los char el compilador por defecto los pille como unsigned. Eso ciertamente es raro (porque el char de toda la vida es con signo), y sí que es útil que indiques cómo solucionarlo.