Hi Jesus,
This is indeed some 'unexpected' behavior, as an alternative you can use (2 methods):
If[ValueQ[f[#]], f[#], "No value"] & /@ Range[10]
Table[If[Head[f[i]] =!= f, f[i], "No value"], {i, 10}]
I think it has to do with ValueQ[f[i]] that is converted to:
!Hold[Evaluate[f[i]]]===Hold[f[i]]
I think the Hold interferes with Table, but I'm not 100% sure what the exact problem is. Reading a 'trace' is never easy:
Trace[Table[If[ValueQ[f[i]], f[i], "No value"], {i, 2}]]
gives:
{Table[If[ValueQ[f[i]],f[i],No value],{i,2}],{{ValueQ[f[i]],!Hold[Evaluate[f[i]]]===Hold[f[i]],{{{{i,1},f[1],1},Hold[1]},Hold[1]===Hold[f[i]],False},!False,True},If[True,f[i],No value],f[i],{i,1},f[1],1},{{ValueQ[f[i]],!Hold[Evaluate[f[i]]]===Hold[f[i]],{{{{i,2},f[2]},Hold[f[2]]},Hold[f[2]]===Hold[f[i]],False},!False,True},If[True,f[i],No value],f[i],{i,2},f[2]},{1,f[2]}}