At a glance, the fit in your plot looks pretty good. Upon closer inspection, there are many problems with the way you are going about this.
Once importing chain from IB here is what I do. Calculate Mid price for each strike
First of all, you need to get this part right. Do you actually calc mid-price and then mid-vol from that? or do you calc bid and ask vol and then calc mid-vol? At any rate, your mid-vols are off. They show multiple butterfly arbs at mid (zero-cost or debit flys). The vol curve in strikes should be convex, meaning the vols between any two strikes should be below a straight line drawn between those two strikes. Draw a line between the mids of the 70 and 80 strikes. The 75-strike mid should fall below that line. It doesn't, it is right on the line, meaning there is a zero-cost 70-75-80 fly at mid (free lottery ticket).
You need to adjust the mids so that you pass an arb-free curve to your smoother. I don't have any R code for this as I do my surface fitting in gawk (C), but I recall a good quant.stackexchange post on this by Alex C with R code. I will see if I can look it up and post it here.
Also your two endpoint vols look biased (down on left, up on right) which is pretty common when dealing very low priced options and bid-ask granulatiry. An ad-hoc adjustment of these two mids is appropriate. This is expecially important in a spline fit because your curve is, by default, anchored at these two points. That means your curve will pass right through those points even when it shouldn't.
fairValue = lm(IvolMid ~ splines::bs(Strikes), data = hqy)
I wouldn't use a spline fit here, because:
1) too much fitting power -- default degree is three (cubic spline) and default interior knots = degree = 3 -- way too much potential curviness for this task
2) anchored at the endpoints by default (see above)
3) more subtly, it assumes your rows are equidistant. I.e. the x-axis on the ftt is an integer line, This is a bad assumption for fitting vols that, for various good theoretical reasons, should be approximately quadratic in log-moneyness.
4) points where the curve's first derivative is high in absolute value will have too great an influence. This is because, in the presence of steep slope, the residual can be large even when the point lies quite close to the curve. These high slope points should be underweighted in your fit.
I would try, instead of a spline, a weighted fit of a 2nd degree polynomial (parabolic fit) in log-moneyness using simple linear algegra (%*% and solve or ginv).