None that would be significantly more efficient. You could fread() chunks of the file into memory and count off the newlines...
But the handling of the function strikes me as odd. If you have to read more than one line from a file, opening it repeatedly is horribly inefficient. The maximum line length is limited by the function. And as a rule I try to avoid malloc() whenever I can, as it's likewise inefficient and error-prone.
My suggestion would be a function int ffindline( FILE * stream, size_t n ). Assuming this is in your C lib (i.e., you know the internals of the FILE struct). You rewind( stream ), then read in chunks of data into the internal buffer attached to FILE (there has to be one, even for unbuffered streams you need one char of buffer at minimum); count of the newlines you find, and simply return once you are at the beginning of the line you looked for, returning 0 on success and -1 on failure (or somesuch).
That way, the client can use your function to "fast forward" to the required line, and then read it with fgets() or fscanf() or whatever suits him. You are relieved of malloc()ing / free()ing the buffer and buffer size limitations.
All in all, the usefulness of this function is limited; as I said, if you have to read more than one line from a file, it's bad to start searching from the beginning every time.
Every good solution is obvious once you've found it.
On second thought, an even more practical approach: How about adding a conversion specifier to fscanf(), which consumes one argument from the parameter list and interprets it as the number of newlines to be skipped?
The above could, for example, skip 3 lines of input. This way, you'd save the additional function call, as you could mix line-skipping and input-parsing in one format string. Also, you would save the effort of rewinding and line counting every time.
Every good solution is obvious once you've found it.