Credo che il problema non dipenda tanto dalle parentesi angolari, ma proprio da un'interruzione del ciclo perché è impostato con una logica un po' contorta (mio parere personale).
Ad ogni modo con jQuery puoi usare la funzione text() che esegue in automatico l'escape dei caratteri per essere correttamente visualizzati in un contenuto html.
In qualunque caso, personalmente, rivedrei tutto lo script.
Ti propongo uno script più snello e funzionante:
codice:
<!DOCTYPE HTML>
<html>
<head>
<title>Esempio</title>
<meta charset="utf-8">
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
$(function(){
$("#boto").click(function(){
var let = 'abcdefghijklmnopqrstuvwxyz 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!"£$%&/()=?^ìèé*[]{}@à°#§ù-_.,;:<>€+|\''.split('');
var cod = '';
while (let.length){cod += let.splice(+(Math.random()*let.length),1)}
$('#code1').html($('<p class="codice"></p>').text(cod));
});
})
</script>
</head>
<body>
<input type="button" id="boto" value="elabora">
<div id="code1"></div>
</body>
</html>