Se eu entendi corretamente, isso deve fazer o que você precisa:
$result = mysql_query("SELECT (specName, (IF EXISTS (SELECT * FROM user_specialty us WHERE s.id = us.sid AND us.uid = '$id' LIMIT 1))) FROM specialities s;");
while (list($spec, $checked) = mysql_fetch_array($result)) {
// Do your outputting here.
}
Editar
A seu pedido, irei em frente e explicarei a consulta. A parte que provavelmente está confundindo você é esta subconsulta:
(IF EXISTS (SELECT * FROM user_specialty us WHERE s.id = us.sid AND us.uid = '$id' LIMIT 1))
O
IF EXISTS
diz ao MySQL para retornar TRUE ou FALSE se a parte imediatamente a seguir 'existir' (contém um resultado). O SELECT * FROM user_specialty us WHERE s.id = us.sid AND us.uid = '$id' LIMIT 1
simplesmente diz ao MySQL para encontrar uma linha em user_specialty
onde s.id = us.sid
(o ID de especialidade corresponde) e us.uid = '$id'
(o ID é do usuário).