Немного странно, но эй, я тоже делал странные вещи.Причина второго результата в том, что казалось странным иметь имя вне div .В любом случае, вот оно.Если это не то, что вы на самом деле просите, уточните, и я обновлю ответ.
let data = [
{ name: 'joe', category: { color: 'red' } },
{ name: 'bob', category: { color: 'green' } },
{ name: 'john', category: { color: 'blue' } },
{ name: 'betty' },
{ name: 'jane', category: { color: 'orange' } },
];
let result = (data.map(obj =>
obj.category && obj.category.color ?
`<div style="border-color:${obj.category.color}" class="circle"></div> ${obj.name}` :
obj.name
)).join('<br>\n');
console.log( 'first result' );
console.log(result);
result = (data.map(obj =>
obj.category && obj.category.color ?
`<div style="border-color:${obj.category.color}" class="circle">${obj.name}</div>` :
obj.name
)).join('<br>\n');
console.log( '\nsecond result' );
console.log( result );