When you write a SELECTCOLUMNS like the first filter:

AfterSpecialDaySales :=
VAR AfterSpecialDates =
    UNION (
        SELECTCOLUMNS (
            FILTER ( 'Date', 'Date'[SpecialDay] = "Special Offer Day" ),
            "Date", [Date] + 1
        ),
        SELECTCOLUMNS (
            FILTER ( 'Date', 'Date'[Day Of Week] = "Sunday" ),
            "Date", [Date]
        )
    )
RETURN
    CALCULATE ( [Sales Amount], AfterSpecialDates )

You are not returning a column. Instead, you are returning an expression ([Date] + 1). An expression has no lineage, i.e. it cannot filter any column in the model, whereas a column has lineage and can filter the model. Because this table result lost its lineage, UNION will remove the lineage from the its result and compute a table with no lineage. Because of that, the result of UNION cannot filter the model and this is the reason why the measure returns the total sales.

You can correct it by changing the FILTER, like in:

AfterSpecialDaySales :=
VAR AfterSpecialDates =
    UNION (
        SELECTCOLUMNS (
            FILTER (
                'Date',
                LOOKUPVALUE (
                    'Date'[SpecialDay],
                    'Date'[Date], 'Date'[Date] - 1
                ) = "Special Offer Day"
            ),
            "Date", [Date]
        ),
        SELECTCOLUMNS (
            FILTER ( 'Date', 'Date'[Day Of Week] = "Sunday" ),
            "Date", [Date]
        )
    )
RETURN
    CALCULATE ( [Sales Amount], AfterSpecialDates )

In this way, SELECTCOLUMNS does not return an expression, instead it returns a column and the lineage is maintained.

DAX Book References

You can find more information about data lineage in The Definitive Guide to DAX:

  • Chapter 9 – Advanced table functions
    • Section “Understanding lineage and relationships”
  • Chapter 10 – Advanced evaluation context
    • Section “Understanding lineage”