Как уменьшить значение типа #cef1ff?
Как вариант решения с обработкой переполнения разрядов и трехсимвольных цветовfunction hexToTriple(hex) {
    hex = hex.slice(1);
    if (hex.length === 3) {
        return hex.split('').map(byte => parseInt(byte.repeat(2), 16));
    } else if (hex.length === 6) {
        return hex.match(/.{2}/g).map(byte => parseInt(byte, 16));
    } else {
        throw new Error(`invalid color ${hex}`);
    }
}

function tripleToHex(triple) {
    return '#' + triple.map(byte => byte.toString(16).padStart(2, '0')).join('');
}

function hexColorSubtract(hexAColor, hexBColor) {
    const [tripleA, tripleB] = [hexAColor, hexBColor].map(hexToTriple);
    const resultTriple = tripleA.map((byte, index) => {
        return Math.max(byte - tripleB[index], 0);
    });
    return tripleToHex(resultTriple);
}

// использование:

hexColorSubtract("#cef", "#110011"); // #bbeeee
Отсекаем решетку, переводим результат из hex в целое, вычитаем, результат переводим в hex, впереди вставляем #let result = parseInt('#cef1ff'.substr(1), 16) - parseInt('#110011'.substr(1), 16);
console.log('#' + result.toString(16).padStart(6, '0'));