Populating a class whose data is stored in an external application
What you have implemented is a sort of Active Record where the record itself knows how to communicate with the storage. 

What is bad about your design is that this kind of code will be extremely hard to unit test. Imagine that you need to write a unit test for a class that uses Person objects. How can you prevent it from calling UserService?

The proper solution for your problem depends on use cases. 


Will you need to update your entities and propagate those changes back to server? 
Can you load several entities at once using methods other than UserService.getPerson(this.id);?
What is the lifetime of the entities loaded?


Generally the most flexible solution (as I see it) would be to implement a repository and unit-of-work pattern (similar to ISession in NHibernate or DbContext in Entity Framework). Basically it's better not to hide communication with 3rd-party but rather expose it in such a way that you have maximum control and flexibility.

Primitive implementation may look like:

public class Person
{
    public string Id { get; set; }

    public string Name { get; set; }
}

public interface ISessionFactory
{
    IUserServiceSession CreateSession();
}

public interface IUserServiceSession
{
    Person GetPerson(string id);
}

public class SessionFactory : ISessionFactory
{
    public IUserServiceSession CreateSession()
    {
        UserService userService = new UserService(); //better use dependency injection, or cache it once if it's thread-safe.
        return new UserServiceSession(userService);
    }
}

public class UserServiceSession : IUserServiceSession
{
    private readonly Dictionary&lt;string, Person&gt; _cache = new Dictionary&lt;string, Person&gt;();
    private readonly UserService _userService;

    public UserServiceSession(UserService userService)
    {
        _userService = userService;
    }

    public Person GetPerson(string id)
    {
        Person result;
        if (!_cache.TryGetValue(id, out result))
            result = _cache[id] = _userService.getPerson(id);

        return result;
    }
}