CURRENT EARNINGS + (GetNthRecord ( YTD GROSS INCOME; Get(RecordNumber)-1))
Looks correct, but the results you get will vary depending on your found set. It refers to the previous record in your found set so you'll get a ? if your currrent record is the first or only record in your found set--that's one possibility. You can also get a ? if your field is too narrow to display the fully formatted value. If this is the case, you can click into the field and then see the value. That's a quick test to tell you if you need to resize the field or to take another look at your found set, sort order and current record again.
Once that's resolved, here's the calculation you wanted:
Let ( [ A = YourTable::TaxableIncomeField ; Tier1 = 41544 ; Tier2 = 45712 ; Tier3 = 138,800 ] ;
0.15 * Min ( A ; Tier1 ) + 0.22 * Min ( A - Tier1 ; Tier1 ) * ( A ≥ tier1 ) + 0.26 * Min ( A - 2 * Tier1 ; Tier2 ) * ( A ≥ 2 * Tier1 ) + 0.29 * ( A - Tier3 ) * ( A > Tier3 )
The boolean expressions such as A > Tier3 will evaluate as 0 when false and this converts each such term to a 0 if the expression is false to keep the Min functions from returning negative values when they should be zero.
I wouldn't actually implement such a calculation however. Tax rates and the "tiers" can and will change and I wouldn't want to create solution where I need to modify such a calculation everytime the powers that be modify tax law. Instead, I'd load the rates, tiers and possibly a text field with an expression in a table and then craft an expression that uses such a table of information instead of such "hardwired" values. That way, the users can adapt to changing rates, etc. by updating this table instead of having to contact the developer.