So I think I see where the problem is. After breaking down the query that is run to grab downloadable files to this:
SELECT o.order_id,
o.order_created,
o.order_user_id,
f.*,
p.*,
Min(o.order_created) AS min_order_created,
Max(o.order_created) AS max_order_created,
Sum(p.order_product_quantity) AS file_quantity,
IF(REPLACE(LEFT(f.file_path, 1), '#', '@') = '@',
Concat(f.file_id, '@', o.order_id), f.file_id) AS uniq_id
FROM chjvm_hikashop_order AS o
INNER JOIN chjvm_hikashop_order_product AS p
ON p.order_id = o.order_id
INNER JOIN chjvm_hikashop_file AS f
ON p.product_id = f.file_ref_id
WHERE o.order_type = 'sale'
AND o.order_status IN ( 'shipped', 'confirmed' )
AND f.file_ref_id > 0
AND f.file_type = 'file'
AND o.order_user_id = 5
GROUP BY uniq_id
ORDER BY max_order_created DESC
I was able to see that the problem is that my p.product.id is the ID of a variant of a product while the f.file_ref_id points to the main product and not the variant. Because of this the INNER JOIN returns nothing since the IDs do not match.
Adding the files to the different variants individually fixes the problem but brings up a new one. If I have a product with 3 variants and I upload a file for each variant and a user purchases one, they see three different download links for the same variant. This is due to a bad join and should be addressed.
Just a heads up, this also fixes the issue of a product not showing up when using a 100% off coupon. Because the order is still created and the file is not set as 'free' there was no reason for it to not show up in the download list before.