Is it possible to change a user's password in the front-end? Is it currently possible to change a user's password in for example the profile edit form? I'm currently using the forgot password approach for this.
It is! To do so, they will have to be logged in and input their old password. They need the old password to change their email or update a password.

Here's an example:

{% macro errorList(errors) %}
    {% if errors %}
        {% for error in errors %}
            &lt;div class="error icon-cancel-circled"&gt;{{ error }}&lt;/div&gt;
        {% endfor %}
    {% endif %}
{% endmacro %}
{% from _self import errorList %}

&lt;form method="post" action="" id="action-form" accept-charset="UTF-8" enctype="multipart/form-data"&gt;
    {{ getCsrfInput() }} {# Remove this if you aren't using CSRF #}
    &lt;input type="hidden" name="action" value="users/saveUser"&gt; {# "users/save-user" if you're on Craft 3 #}
    &lt;input type="hidden" name="redirect" value="{{ entry.url }}"&gt;
    &lt;input type="hidden" name="userId" value="{{ currentUser.id }}"&gt;

    &lt;label for="currentPassword"&gt;Current Password&lt;/label&gt;
    &lt;input type="text" class="form-control" id="currentPassword" name="password" /&gt;
    {% if account is defined %}
        {{ errorList(account.getErrors('currentPassword')) }}
    {% endif %}

    &lt;label for="email"&gt;Email&lt;/label&gt;
    &lt;input id="email" type="text" name="email" class="text" /&gt;
    {% if account is defined %}
        {{ errorList(account.getErrors('email')) }}
    {% endif %}

    &lt;label for="newPassword"&gt;New Password&lt;/label&gt;
    &lt;input type="text" class="form-control" id="newPassword" name="newPassword" /&gt;
    {% if account is defined %}
        {{ errorList(account.getErrors('newPassword')) }}
    {% endif %}
&lt;/form&gt;


This is code that would be inserted into a new custom front end template.