The comma in your selector splits it like this:
✅ .features li:not(:first-child) h2 or p.
You seem to expect it to split it like this:
❌ .features li:not(:first-child) h2 or .features li:not(:first-child) p.
CSS doesn't have syntax which allows that kind of shorthand. you have to be explicit:
.features li:not(:first-child) h2,
.features li:not(:first-child) p { ... }
There are preprocessors which provide more convenient syntax. For example, if you were writing SASS using the SCSS syntax:
.features li:not(:first-child) {
h2, p { ... }
}