WARNING: Do not add white-space to the start or end of the Target Passage Name reference of your Markup based Links, doing this will result in the Automatically Create Missing Passages feature of the Twine 2.x application creating you a new Passage with invalid white-space characters in it's Name.
eg. your [[passage 1 -> passage 2]] markup link examplewill result in a new Passage named " passage 2".
(note the invalid space character at the start of the passage name.)
Your markup based link should look like the following.
[[passage 1->passage 2]]
As you have noted passage content like the following will result in link text that Shudders but that text will not be Red.
(set: _blur to (text-style: "shudder") + (transition-time: 50s) + (text-colour: red))
_blur[ [[Link Text 1->Target Passage Name]] ]
_blur[ [[Link Text 2->Target Passage Name]] ]
If you use your web-browser's built in Web Developer Tools to Inspect the HTML struture generated for each of the links in the above passage content you will see that it looks something like the following.
<tw-hook style="animation: shudder 0.1s linear 0s infinite normal none running; display: inline-block; color: rgb(230, 25, 25);">
<tw-expression type="macro" name="link-goto">
<tw-link tabindex="0" passage-name="Target Passage Name" data-raw="">Link Text 1</tw-link>
</tw-expression>
</tw-hook>
And if you view the CSS being applied to the tw-link element in the above, by selecting it within the Elements tab, you will learn that Harlowe assigns it's default link colour directly to that element.
This is the reason why your overridding link text colour is not being applied to the link (the tw-link element)
To overcome Halowe's behaviour you will need to place CSS like the following within your project's Story Stylesheet area.
tw-hook[style^="color"] tw-link:not(:hover),
tw-hook[style*=" color"] tw-link:not(:hover),
tw-hook[style^="color"] .enchantment-link:not(:hover),
tw-hook[style*=" color"] .enchantment-link:not(:hover) {
color: inherit;
}