Es porque en la segunda consulta usas una variable que se llama $d, que no esta definida aun, cuando usas el texto directo ya se ha definido esa variable entonces si te funciona:
Código PHP:
function discosdeart($artista) {
$consulta = "select discos.anio,discos.nombre,discos.imagen,discos.d_id from discos inner join discart on discos.d_id=discart.d_id where discart.a_id = '$artista'";
$art = mysql_query($consulta);
while ($row = mysql_fetch_array($art)) {
echo "<div id='disco'>";
echo $row[nombre].'<br />';
echo $row[anio].'<br />';
echo $row[imagen].'<br />';
echo $row[d_id].'<br />';
$d = $row[d_id];
$consulta2 = "select letras.nombre from letras inner join letdisc on letras.l_id=letdisc.l_id where letdisc.d_id like '$d' order by letdisc.Numero";
$letdisc = mysql_query($consulta2);
while ($row2 = mysql_fetch_array($letdisc)) {
echo $row2[nombre].'<br />';
}