Yes, there is. You can use Monitor
Monitor[
Table[Pause[1]; i, {i, 10}],
i
]

Some explanations
Table uses dynamic scoping to localize its variable (i in this case), just like Block. This means that while Table is evaluating, i has a "global" value that one can inspect even from outside the Table if we interrupt the evaluation.
On way of interrupting the evaluation is to request i's value on the pre-emptive link (i.e. using Dynamic expressions) We could just put Dynamic[i] somewhere and it would count up just like Manipulate while the Table is evaluating.
Another way of interrupting the evaluation is through entering a Dialog: You can use the Evaluation -> Interrupt evaluation... menu item, choose Enter subsession. You will get a prompt where you can inspect the kernel state (including the value of i, Stack[], etc.). Evaluate Return[] to resume he evaluation.
I have been using both of these techniques extensively to monitor very lengthy evaluations. The second one even seems to work for parallel evaluations, and least in those cases where I tried it.
Iteration variable and already calculated values
If there is no iteration variable in the Table, just insert one, and use Table[..., {i, 1000}]. Then we can use Monitor or Dynamic[i].
It is not possible to get the already calculated values. If you want to do this (it would often be desirable to be able to!), you need to implement your own version of Table. I asked about how to implement an interruptible parallel Table or Map in this question. The solution I got does not allow inspecting the so far calculated results, but it lets me interrupt the calculation, and continue from where I stopped later.
A table function that allows monitoring partial results
As an example, I provide a custom table function that allows monitoring the partial results.
Try evaluating
Dynamic[table`Results[]]
table[Pause[1]; i^2, {i, 10}]
``tableResults[] could be used in Monitor too.
I am using a linked list to collect the results for better performance than what AppendTo would give. I cannot use Sow/Reap here because they don't allow inspecting the partial results (at least I am not aware of this being possible).
Note: If you use nested tables, only the inner one can be monitored, but all of them will work correctly.
The code:
ClearAll[table, table`result, table`Results]
SetAttributes[table, HoldAll]
table`result = {};
table[expr_, iterator__] :=
Block[{table`result, table`elem},
table`result = {};
Do[
table`result = {table`result, table`elem[expr]},
iterator
];
table`Results[]
]
table`Results[] := Block[{table`res, table`elem},
table`res = Flatten[table`result];
table`elem = Identity;
table`res
]
SuperSlowExpressionto begin with, it seems worthwhile to set up a cache variable beforehand, and then modifySuperSlowExpressionto store to the cache (with e.g.Append[]/AppendTo[]) with each iteration withinTable[]. – J. M.'s missing motivation Feb 08 '12 at 10:41