Query performance of this Select Where each Column is a Select
You could try to use a PIVOT statement in order to convert values of several rows into columns. I show it for Abbestellungen.EssenTyp here. You will have to combine it with the rest of your query.

SELECT RefKundeId, [0] AS Fruehstuck, [1] AS Vesper, [2] AS Abendbrot
FROM (SELECT RefKundeId, EssenTyp FROM Abbestellungen WHERE [date] = @Datum) a
PIVOT
(
    MAX (EssenTyp)
    FOR EssenTyp IN ([0], [1], [2])
) AS pvt;


I am not sure which value you want to return for the EssenTyp columns. Your query returns the EssenTyp id, but your example result set returns 1. So may be you want a count? Then you would have to replace MAX(EssenTyp) by SUM (1) or COUNT(EssenTyp). If you are storing a number of meals say in a column Anzahl (german 'number'), then write SUM(Anzahl). In any case you need an aggregate function for the pivot operation.

Will it be faster? I don't know. Make experiments. Instead of making two independent pivot queries for Abbestellungen and Bestellung, you could combine the two in a UNION query and pivot them together:

SELECT
    RefKundeId,
    [0] AS Fruehstuck, [1] AS Vesper, [2] AS Abendbrot, [10] AS Menu1, [11] AS Menu2
FROM (
    SELECT RefKundeId, EssenTyp AS nr, 1 AS value
    FROM Abbestellungen
    WHERE [date] = @Datum

    UNION ALL

    SELECT B.RefKundeId, D.SpaltenNr + 10 AS nr, D.Anzahl AS value
    FROM
        Bestellung B
        INNER JOIN BestellDetails D
            ON B.BestellId = D.RefBestellId
    WHERE D.Datum = @Datum
) A
PIVOT
(
    SUM (value)
    FOR nr IN ([0], [1], [2], [10], [11])
) AS pvt;