In your example, target=incr() would die trying to run incr in the main thread without passing an argument (and even if it succeeded, it would do nothing when it tried to launch a thread with None as the target; None is what incr implicitly returns). Running with target=incr would perform the incrementing in a thread as expected.
The case for using target=incr() would be to use a closure to avoid polluting global scope. For example, in Python 3, you could do:
def incr():
counter = 0
def incr_inner(num):
nonlocal counter
count = 0
for i in range(1000):
counter += 1
print("\nWorker: {}, Counter: {}, Self-count: {} .".format(num, counter, count))
print(counter)
return incr_inner
which would create a per-thread counter not shared in the global scope; by setting target=incr(), it would call the outer incr and return the enclosed function incr_inner as the real target, with its own unique counter variable.
The nesting as a closure is mostly about implementation hiding and brevity (and it doesn't always work as you'd hope; in Python 2, without the nonlocal keyword, it can't be made to run as written without some hackery). But you can make callable objects from a class in any version of Python, and get roughly the same "stateful thread" behavior. For example:
class incr(object):
def __init__(self):
self.counter = 0
def __call__(self, num):
count = 0
for i in range(1000):
self.counter += 1
print("\nWorker: {}, Counter: {}, Self-count: {} .".format(num, self.counter, count))
print(self.counter)
And just like the closure case, this class could be used as an argument that maintained independent counters for each thread when passed as target=incr().