Okay, I believe this is fixed — via an ugly hack that is probably not doing the right thing, but I’m okay with that — but I’d still welcome feedback from someone who, like, actually knows PHP. 🙂
I changed it by modifying, in feed-functions.php, get_bloginfo_rss(), to do a manual str_replace specifically for ampersands:
function get_bloginfo_rss($show = '') {
$info = strip_tags(get_bloginfo($show));
$info = str_replace('&', '&', $info);
return convert_chars($info);
}
I believe this is happening because convert_chars() only appears to replace bare ampersands; if they are followed by # or a semi-colon-terminated string they are ignored.
So. Ugly, but it seems to work, so I’m going to go with it for now.