hex: xc5 x82
That's the UTF-8 byte encoding of ł.
s = String.fromCharCode(b[0], b[1]);
That's interpreting each byte as a single character, which is effectively decoding the bytes using the ISO-8859-1 encoding, because this encoding happens to share the same numbers as the first 256 characters of Unicode.
There is a neat JavaScript trick to turn a string where each character stands in for the byte of the same number, into a UTF-8 decoded string: send it through the legacy escape() builtin function, which is a broken URL-encoder, and then decode it using the real URL-decoder, decodeURIComponent.
So for any Array of UTF-8 bytes you can get the decoded Unicode String by doing:
function utf8BytesToString(b) {
return decodeURIComponent(escape(String.fromCharCode.apply(null, b)));
}
utf8BytesToString([0xc5, 0x82]) // "ł"