Ummm, I have no problem doing the substitution using the code supplied:
$line = "She was very absorbed in her homework.";
$word = "absorb";
print STDOUT "Line: $line\n";
$line =~ s/($word(?:s|ed))/<b>$1<\/b>/igm;
print STDOUT "New Line: $line\n";
print STDOUT "\$1 contains: $1\n";
Of course, I might consider changing it slightly to read:
$line =~ s/\b(${word}(?:s|ed)?)\b/<b>$1<\/b>/igm;
However, I did just discover that there is something more going on here, because while the original (without the \b) does set something in $1, my change doesn't (despite doing the substitution properly).
And finally, if you're just doing a match why are you using s///?