Single pass algorithm for finding the topX percent of items
top_nums = sorted(list(islice(iterable, int(percent*min_guess)))) #get an initial guess


There is no reason to make a list out of it before you sort it.

for ind, val in enumerate(iterable, len(top_nums))


I dislike abbreviations. I think it makes it harder to figure out what ind and val are doing. 

   all_data = sorted(data_gen(num))


Why are you sorting your test data? 

As I understand your problem, your code is wrong. It only works in your test case because you sort the incoming data. 

Your algorithm regularly increases the size of the list of values. But when it does so, there have been previous numbers which have been thrown away which may greater then the value you insert at that point. As a result, you cannot be sure you've actually ended up with with the top 1%.

How should you fix it? If you can upper bound the size of your input, then you can start with a list of sufficient size and then scale back at the end. Otherwise I don't think you can do it. The problem being that you cannot throw away any values because there is no way to be sure you won't need them later.

You might consider using a heap. Python has a heapq module including a function heapq.nlargest which does pretty much what you are doing, (but uses a count rather then a percentage) A heap is pretty much a semi-sorted list and lets you do things like find/remove/replace the lowest value without the overhead of actually sorting.